المتجهات هي مصفوفات ديناميكية في C++، تقدم طريقة مرنة لإدارة تسلسلات العناصر. التكرار الفعال أمر بالغ الأهمية للعديد من العمليات القائمة على المتجهات. تستكشف هذه المقالة عدة طرق للتكرار عبر متجهات C++، مع تقديم أمثلة واضحة لكل منها.
جدول المحتويات
- فهم المتجهات في C++
- التكرار باستخدام حلقة
for
التقليدية - التكرار باستخدام حلقة
for
القائمة على النطاق - التكرار باستخدام المُكررات
- اختيار طريقة التكرار المناسبة
فهم المتجهات في C++
المتجهات، جزء من مكتبة القوالب القياسية في C++ (STL)، يتم تعريفها باستخدام رأس الملف <vector>
. وهي تقدم مزايا كبيرة مقارنة بمصفوفات C التقليدية:
- حجم ديناميكي: تقوم المتجهات تلقائيًا بإعادة تغيير حجمها حسب الحاجة، مما يبسط إدارة الذاكرة.
- سهولة الوصول إلى العناصر: يتم الوصول إلى العناصر باستخدام عامل التشغيل
[]
، مشابه للمصفوفات. - التكامل مع STL: تتكامل المتجهات بسلاسة مع مكونات STL الأخرى.
فيما يلي كيفية تعريف ومتجهة:
#include <iostream>
#include <vector>
int main() {
std::vector<int> myVector = {1, 2, 3, 4, 5};
return 0;
}
التكرار باستخدام حلقة for
التقليدية
توفر حلقة for
التقليدية تحكمًا صريحًا في التكرار:
#include <iostream>
#include <vector>
int main() {
std::vector<int> myVector = {1, 2, 3, 4, 5};
for (size_t i = 0; i < myVector.size(); ++i) {
std::cout << myVector[i] << " ";
}
std::cout << std::endl; // الإخراج: 1 2 3 4 5
return 0;
}
يضمن استخدام size_t
لعداد الحلقة التوافق و يتجنب التحذيرات المحتملة.
التكرار باستخدام حلقة for
القائمة على النطاق
تم تقديم حلقة for
القائمة على النطاق في C++11، وهي تبسط عملية التكرار:
#include <iostream>
#include <vector>
int main() {
std::vector<int> myVector = {1, 2, 3, 4, 5};
for (auto element : myVector) {
std::cout << element << " ";
}
std::cout << std::endl; // الإخراج: 1 2 3 4 5
return 0;
}
يقوم auto
تلقائيًا باستنتاج نوع العنصر، مما يجعل الكود مختصراً وقابلاً للقراءة.
التكرار باستخدام المُكررات
توفر المُكررات طريقة قوية ومرنة لاجتياز الحاويات. وهي تدعم طرق الاجتياز الأمامي، والعكسي، وطرق أخرى. في حين أنها أقل إيجازاً للتكرار البسيط، إلا أنها ضرورية للعمليات المعقدة.
#include <iostream>
#include <vector>
int main() {
std::vector<int> myVector = {1, 2, 3, 4, 5};
for (std::vector<int>::iterator it = myVector.begin(); it != myVector.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl; // الإخراج: 1 2 3 4 5
return 0;
}
myVector.begin()
و myVector.end()
تُعيد مُكررات تشير إلى بداية ونهاية المتجه على التوالي. عامل الإسناد المرجعي (*
) يوصل قيمة المُكرر.
اختيار طريقة التكرار المناسبة
تعتمد أفضل طريقة للتكرار على احتياجاتك. بالنسبة للتكرار البسيط، غالبًا ما تكون حلقة for
القائمة على النطاق هي الأفضل لقابلية قراءتها وكفاءتها. توفر حلقة for
التقليدية المزيد من التحكم، بينما توفر المُكررات أقصى قدر من المرونة للسيناريوهات المتقدمة.