logo

التكرارات في C++ STL

ان  مكرر في C++  هو كائن يشبه المؤشر يشير إلى عنصر في حاوية STL. يتم استخدامها عمومًا للتنقل خلال محتويات حاوية STL في لغة C++. الميزة الرئيسية لتكرارات STL هي أنها تجعل خوارزميات STL مستقلة عن نوع الحاوية المستخدمة. يمكننا فقط تمرير المكرر إلى عناصر الحاوية بدلاً من الحاوية نفسها إلى خوارزميات STL.

إعلان التكرار

تحتوي كل حاوية في C++ STL على مكرر خاص بها. لذلك يتعين علينا أن نعلن عن المكرر على النحو التالي:



C++
<type>::iterator it; 

أين

  • يكتب: نوع الحاوية التي تم الإعلان عن المكرر لها.
  • هو - هي: الاسم المخصص لكائن التكرار.

يمكننا بعد ذلك تهيئته عن طريق تعيين مكرر صالح. إذا كان لدينا بالفعل مكرر سيتم تعيينه في وقت التحديد، فيمكننا تخطي تعريف النوع باستخدام آلي الكلمة الرئيسية.

C++
auto it = iter 

أين iter هو المكرر المخصص للمكرر الذي تم إنشاؤه حديثًا.



ملكنا دورة لغة سي++ يغطي استخدام التكرارات في STL مما يضمن فهمك لكيفية اجتياز أنواع الحاويات المختلفة.

مثال على التكرارات

يوضح البرنامج أدناه كيفية استخدام المكرر لاجتياز حاوية المتجهات:

C++
#include    using namespace std; int main() {  vector<int> v = {1 2 3 4 5};  // Defining an iterator pointing to  // the beginning of the vector  vector<int>::iterator first =  v.begin();  // Defining an iterator pointing  // to the end of the vector  vector<int>::iterator last =  v.end();    // Iterating the whole vector  while(first != last) {  cout << *first << ' ';  first++;  }  return 0; } 

الإخراج
1 2 3 4 5 

كما كنت قد لاحظت أننا استخدمنا المتجه::begin() والمتجه ::end() وظيفة. هذه الوظائف هي وظائف الأعضاء في std::vector التي تُرجع المُكرِّر إلى العنصر الأول والعنصر الواحد بعد العنصر الأخير في المتجه. نحن نستخدم التكرارات لإرجاع هذه الوظائف لتكرار المتجهات.



وظائف مكرر الحاوية

يوفر C++ STL بعض وظائف الأعضاء في حاوية STL التي تعيد التكرارات إلى العنصر الأول والأخير على الأقل. يتم تعريف وظائف الأعضاء هذه في جميع حاويات STL تقريبًا (تاركًا بعض حاويات الوصول المحدودة مثل كومة طابور ) بنفس الاسم من أجل الاتساق.

يسرد الجدول التالي جميع الطرق التي تُرجع المُكرِّر إلى الحاويات:

وظيفة التكرار

قيمة الإرجاع

يبدأ()

إرجاع مكرر إلى بداية الحاوية.

نهاية()

يُرجع مُكرِّرًا إلى العنصر النظري بعد العنصر الأخير في الحاوية مباشرةً.

كبداية ()

إرجاع مكرر ثابت إلى بداية الحاوية. لا يمكن للمكرر الثابت تعديل قيمة العنصر الذي يشير إليه.

عدد قليل ()

النوم في جافا سكريبت

يُرجع مكررًا ثابتًا إلى العنصر النظري مباشرةً بعد العنصر الأخير في الحاوية.

ربجين ()

إرجاع مكرر عكسي إلى بداية الحاوية.

يجعل()

يُرجع مكررًا عكسيًا إلى العنصر النظري مباشرةً بعد العنصر الأخير في الحاوية.

كربيجين ()

إرجاع مكرر عكسي ثابت إلى بداية الحاوية.

كريند ()

يُرجع مكررًا عكسيًا ثابتًا إلى العنصر النظري بعد العنصر الأخير في الحاوية مباشرةً.

على سبيل المثال إذا شيء هو اسم المتجه فيمكننا استخدام الطرق المذكورة أعلاه كما هو موضح أدناه:

C++
vec.begin() vec.rbegin() vec.cbegin() vec.crbegin() vec.end() vec.rend()  vec.cend() vec.crend() 

عمليات التكرارات

تمامًا مثل حساب المؤشر، هناك بعض العمليات المسموح بها على مكررات C++. يتم استخدامها لتوفير وظائف مختلفة تزيد من أهمية التكرارات. هناك 5 صالحة عمليات التكرار في C++ :

  • إلغاء مرجعية التكرارات
  • زيادة/تناقص التكرارات
  • إضافة/طرح عدد صحيح إلى التكرارات
  • طرح مكرر آخر
  • مقارنة التكرارات

إلغاء مرجعية التكرارات

تسمح عملية إلغاء الإشارة للمستخدمين بذلك الوصول أو التحديث قيمة العنصر الذي أشار إليه المكرر. نحن نستخدم (*) عامل غير اتجاهي لإلغاء الإشارة إلى التكرارات تمامًا مثل المؤشرات.

C++
// Access *it; // Update *it = new_val;  

أين new_val هي القيمة الجديدة المخصصة للعنصر الذي يشير إليه المكرر هو - هي .

زيادة/تناقص التكرارات

يمكننا زيادة أو تقليل المكرر بمقدار 1 باستخدام (++) أو (--) عوامل التشغيل على التوالى. تقوم عملية الزيادة بنقل المكرر إلى العنصر التالي في الحاوية بينما تقوم عملية التخفيض بنقل المكرر إلى العنصر السابق.

C++
it++; // post-increment ++it; // pre-increment it--; // post-decrement --it; // pre-decrement 

إضافة/طرح عدد صحيح إلى التكرارات

يمكننا أيضًا إضافة أو طرح قيمة عددية من التكرارات. سيؤدي ذلك إلى زيادة موضع التكرار التالي أو السابق وفقًا لقيمة العدد الصحيح المضافة.

C++
// Addition it + int_val;  // Subtraction it - int_val;  

أين int_val هي القيم الصحيحة التي تتم إضافتها أو طرحها من المكرر هو - هي .

طرح مكرر آخر

يمكننا طرح مكرر واحد من الآخر للعثور على المسافة (أو عدد العناصر) بين الذاكرة التي يشيرون إليها.

C++
it1 - it2 

مقارنة التكرارات

يمكننا أيضًا اختبار المكررين من نفس النوع مقابل بعضهما البعض للعثور على العلاقة بينهما. يمكننا استخدام عوامل العلائقية مثل (==) عوامل المساواة و(!=) عوامل عدم المساواة بالإضافة إلى عوامل علائقية أخرى مثل< > <= >=.

C++
it1 != it2 // Equal to it1 == it2 // Not equal to it1 > it2 // Greater than it1 < it2 // Less than it1 >= it2 // Greater than equal to it1 <= it2 // Less than equal to 

أنواع التكرارات في C++

يمكن تقسيم مكررات STL على أساس العمليات التي يمكن إجراؤها عليها. هناك 5 أنواع رئيسية من التكرارات في لغة C++، وهي مدرجة في الجدول أدناه بالإضافة إلى الحاويات المدعومة وعمليات التكرار المدعومة.

مكرر

وصف

الحاويات المدعومة

العمليات المدعومة

مكرر الإدخال

إنه مكرر أحادي الاتجاه يستخدم لقراءة القيم.

دفق الإدخال

إلغاء المساواة في الزيادة

مكرر الإخراج

وهو أيضًا مكرر أحادي الاتجاه ولكنه يستخدم لتعيين القيم. لا يمكن الوصول إلى القيم.

تيار الإخراج

إلغاء الإشارة (الكتابة فقط) الزيادة

التكرارات إلى الأمام

يمكنه الوصول إلى القيم وكذلك تعيينها. إنه مزيج من مكرر الإدخال والإخراج.

Forward_list unordered_map unordered_set

إلغاء المساواة في الزيادة

التكرارات ثنائية الاتجاه

ويمكن أن تتحرك في كلا الاتجاهين إما إلى الأمام أو إلى الخلف. تدعم الحاويات مثل مجموعة القوائم والخريطة المتعددة التكرارات ثنائية الاتجاه.

مجموعة خريطة القائمة multimap multiset

إلغاء الإشارة إلى الزيادة/النقصان المساواة

مكررات الوصول العشوائي

مُكرِّرات الوصول العشوائي هي مُكرِّرات يمكن استخدامها للوصول إلى العناصر البعيدة عن العنصر الذي تشير إليه لتقديم نفس وظيفة المؤشرات.

ناقلات مجموعة deque سلسلة

jframe

الجميع

كما لاحظنا من الجدول أعلاه بصرف النظر عن تكرارات الإدخال والإخراج أثناء نزولنا في الجدول، يحتوي نوع المكرر على ميزات المكرر أعلاه بالإضافة إلى بعض الميزات الجديدة.

محولات التكرار

تعد محولات التكرار في لغة C++ نوعًا خاصًا من التكرارات المبنية على التكرارات التقليدية لتوفير وظائف متخصصة. هناك العديد من محولات التكرار في C++، وبعضها موضح أدناه:

نوع محولات التكرار

وصف

التكرار العكسي

تم بناء المكرر العكسي على نوع المشغل ثنائي الاتجاه أو أعلى ويسمح للمستخدمين باجتياز الحاوية في الاتجاه العكسي.

تكرارات الدفق

تم بناء مكررات الدفق وهي مكررات istream وostream على مكررات الإدخال والإخراج على التوالي. تسمح هذه التكرارات للمستخدمين باستخدام التدفقات كحاويات.

حرك التكرارات

تُستخدم مكررات النقل لتقديم دلالات الحركة في خوارزميات STL. تقوم مكررات النقل بنقل ملكية بيانات الحاوية المنسوخة إلى حاوية النسخ دون إنشاء النسخ الإضافية.

مكرر الواضع

تسمح لك مكررات المُدخل بإدراج العناصر المحددة في موضع ما في الحاوية. هناك ثلاثة مكررات مُدخلة في C++:

  1. back_insert_iterator: إدراج في الجزء الخلفي من الحاوية.
  2. front_insert_iterator: إدراج في الجزء الأمامي من الحاوية.
  3. إدراج_المكرر: إدراج في أي مكان في الحاوية.

يمكن إنشاء هذه التكرارات باستخدام back_inserter() front_inserter() إدراج () وظائف في C++.

وظائف الأداة المساعدة للتكرار في C++

يوفر C++ STL الوظائف المختلفة لتبسيط العمل مع التكرارات. وهي مدرجة في الجدول أدناه:

وظيفة وصف بناء الجملة
الأمراض المنقولة جنسيا::تقدم تقدم المكرر بعدد محدد من المواضع. يتقدم ( هو ن )
الأمراض المنقولة جنسيا::التالي يُرجع المكرِّر الذي يمثل عددًا محددًا من المواضع قبل المكرِّر المحدد. التالي ( هو ن )
الأمراض المنقولة جنسيا :: السابق إرجاع المكرر الذي يمثل عددًا محددًا من المواضع خلف المكرر المحدد. السابق ( هو ن )
الأمراض المنقولة جنسيا::مسافة إرجاع عدد العناصر بين مكررين. مسافة ( it1 it2 )
الأمراض المنقولة جنسيا::ابدأإرجاع مكرر إلى العنصر الأول في الحاوية المحددة. يبدأ ( حاوية )
الأمراض المنقولة جنسيا::نهايةيُرجع مُكرِّرًا إلى العنصر الذي يلي العنصر الأخير في الحاوية المحددة. نهاية ( حاوية )
الأمراض المنقولة جنسيا::rbeginتقوم بإرجاع مكرر عكسي إلى العنصر الأخير في الحاوية المحددة. rbegin ( حاوية )
الأمراض المنقولة جنسيا::رينديُرجع مكررًا عكسيًا إلى العنصر الذي يسبق العنصر الأول في الحاوية المحددة. يجعل ( حاوية )
الأمراض المنقولة جنسيا::الواضع ينشئ مكرر إدراج يقوم بإدراج العناصر في حاوية في موضع محدد. الواضع ( موقف الحاوية )
الأمراض المنقولة جنسيا::back_inserter ينشئ مكرر إدراج خلفي يقوم بإلحاق العناصر بنهاية الحاوية. back_inserter ( حاوية )
الأمراض المنقولة جنسيا::front_inserter ينشئ مكرر إدراج أمامي يقوم بإدراج العناصر في مقدمة الحاوية. front_inserter ( حاوية )

تطبيقات التكرارات مع الأمثلة

يتم استخدام التكرارات على نطاق واسع في لغة C++ للعديد من الأغراض المختلفة أثناء العمل مع حاويات وخوارزميات STL. فيما يلي بعض التطبيقات الأساسية للمكررات في C++ والتي تتضمن أمثلة التعليمات البرمجية الخاصة بها:

عبور الحاويات

يعد اجتياز حاويات STL التطبيق الأساسي للمكررات. في هذا نستخدم الدالتين begin() و end() للحصول على مكررات البداية والنهاية لاجتياز الحاوية بأكملها. في الأساس، نستمر في زيادة مكرر البداية حتى لا يساوي النهاية.

مثال

C++
#include    using namespace std; int main() {  set<int> s = {10 20 30   40 50};  // Iterator to the beginning   // of the set  auto it = s.begin();  // Iterating through the   // entire set  while (it != s.end()) {    // Dereferencing iterator   // to access value  cout << *it << ' ';    // Incrementing the   // iterator  it++;  }    return 0; } 

الإخراج
10 20 30 40 50 

كما هو موضح في الكود أعلاه، فإننا نجتاز الحاوية المحددة. وبالمثل يمكننا استخدام نفس النهج لاجتياز أي حاوية.

عكس حاوية

تسمح لك التكرارات العكسية باجتياز الحاوية من النهاية إلى البداية دون الحاجة إلى معالجة الانعكاس يدويًا.

مثال

C++
#include    using namespace std; int main() {  vector<int> vec = {10 20 30   40 50};  // Defining reverse iterators   // pointing to the reverse   // beginning of vec  auto it = vec.rbegin();  // Iterating the whole   // vector in reverse  while (it != vec.rend()) {  cout << *it << ' ';  it++;  }  return 0; } 

الإخراج
50 40 30 20 10 

خوارزميات مستقلة عن الحاوية

تسمح التكرارات للخوارزميات بالعمل مع أي نوع من أنواع الحاويات مما يجعل وظائف مثل std::sort() std::find() وstd::for_each() أكثر مرونة. يمكنك تمرير التكرارات بدلاً من الحاوية الفعلية.

مثال

C++
#include    using namespace std; int main() {  vector<int> vec = {30 10 40   10 50};  multiset<int> ms = {10 30 10   20 40 10};  // Using the std::count() algorithm to count  // the number of occurences of 10 in vector  // and multiset using iterator  cout << '10s in Vector: '   << count(vec.begin()  vec.end() 10) << endl;  cout << '10s in Multiset: '   << count(ms.begin()  ms.end() 10);  return 0; } 

الإخراج
10s in Vector: 2 10s in Multiset: 3

تطبيقات إضافية للتكرارات

هناك المزيد من تطبيقات مكررات STL:

  • حساب المسافة: يساعد استخدام التكرارات std::distance() في حساب عدد العناصر بين موضعين في الحاوية.
  • تكرار الدفق: تتيح لك مكررات الدفق التعامل مع تدفقات الإدخال/الإخراج مثل الحاويات مما يسهل القراءة منها والكتابة إلى التدفقات باستخدام خوارزميات STL.
  • نقل الدلالات في خوارزميات STL: تقدم مكررات النقل دلالات الحركة في خوارزميات STL والتي تساعد في زيادة الأداء والكفاءة عن طريق تجنب النسخ غير الضروري. سيتم نقل البيانات وفقًا لقواعد دلالات النقل.
  • التكرارات المخصصة لهياكل البيانات: يمكن تنفيذ التكرارات المخصصة لهياكل البيانات غير الخاصة بـ STL مثل الأشجار أو الرسوم البيانية لتوفير الدعم لخوارزميات STL والعديد من الميزات الأخرى. قد نحتاج إلى اتباع مجموعة قليلة من القواعد والاتفاقيات لتوفير عمليات التناقص المتزايدة وغيرها من العمليات.