AN איטרטור ב- C ++ הוא אובייקט דמוי מצביע שמצביע על אלמנט של מיכל ה- STL. בדרך כלל הם משמשים לולאה דרך תוכן מיכל ה- STL ב- C ++. היתרון העיקרי של איטרטורים STL הוא שהם הופכים את אלגוריתמי ה- STL ללא תלות בסוג המכולה המשמש. אנו יכולים פשוט להעביר את האיטרטור לאלמנטים המכולתיים במקום למכולה עצמה לאלגוריתמי STL.
הצהרת איטרטור
לכל מיכל ב- C ++ STL יש איטרטור משלו. אז עלינו להכריז על איטרטור כ:
C++
<type>::iterator it;
אֵיפֹה
- סוּג: סוג המכולה שעבורו מוכרז האיטרטור.
- זֶה: שם שהוקצה לאובייקט iterator.
לאחר מכן נוכל לאתחל אותו על ידי הקצאת איטרטור תקף. אם כבר יש לנו איטרטור שיוקצה בזמן ההפלה, נוכל לדלג על הצהרת הסוג באמצעות רכב מילת מפתח.
C++auto it = iter
אֵיפֹה איטר הוא האיטרטור שהוקצה לאיטרטור ה- IT החדש שנוצר.
שֶׁלָנוּ C ++ קורס מכסה את השימוש באיטרטורים ב- 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
כפי שאולי שמתם לב שהשתמשנו בו וקטור :: התחל () וקטור :: סוף () פוּנקצִיָה. פונקציות אלה הן פונקציות החברות ל- STD :: וקטור המחזיר את האיטרטור לאלמנט הראשון ואחד אחרי האלמנט האחרון בווקטור. אנו משתמשים בחזרי החזרות הם פונקציות אלה כדי לאתר את הווקטורים.
פונקציות איטרטור מיכל
C ++ STL מספק כמה פונקציות חברים ב מיכל STL זה מחזיר את האיטרטורים לפחות לאלמנט הראשון והאחרון. פונקציות חברים אלה מוגדרות כמעט בכל מיכל ה- STL (משאיר כמה מכולות גישה מוגבלות כמו לַעֲרוֹם תוֹר ) עם אותו שם לעקביות.
הטבלה הבאה מציגה את כל השיטות שמחזיר את האיטרטור למכולות:
פונקציית iterator | ערך החזרה |
|---|---|
לְהַתְחִיל() | מחזיר איטרטור לתחילת המכולה. |
סוֹף() | מחזיר איטרטור לאלמנט התיאורטי ממש אחרי האלמנט האחרון של המכולה. |
cbegin () | מחזיר איטרטור קבוע לתחילת המכולה. איטרטור קבוע אינו יכול לשנות את ערך האלמנט עליו הוא מצביע. |
אֲחָדִים() מפעילי java | מחזיר איטרטור קבוע לאלמנט התיאורטי ממש אחרי האלמנט האחרון של המכולה. |
rbegin () | מחזיר איטרטור הפוך לתחילת המכולה. |
לְדַקלֵם() | מחזיר איטרטור הפוך לאלמנט התיאורטי ממש אחרי האלמנט האחרון של המכולה. |
crbegin () | מחזיר איטרטור הפוך קבוע לתחילת המכולה. |
Crend () | מחזיר איטרטור הפוך קבוע לאלמנט התיאורטי רגע אחרי האלמנט האחרון של המכולה. |
למשל אם דבר הוא שם הווקטור אז נוכל להשתמש בשיטות לעיל כמוצג להלן:
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 הוא הערך החדש שהוקצה לאלמנט שהצביע על ידי iterator זֶה ו
הגדלת/ירידה של איטראטורים
אנו יכולים להגדיל או להקטין את האיטרטור על ידי 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 ++, אשר כמפורט בטבלה שלהלן יחד עם מכולות נתמכות ופעולות איטרטור נתמכות.
איטרטור | תֵאוּר | מכולות נתמכות | פעולות נתמכות |
|---|---|---|---|
איטרטור קלט | זהו איטרטור חד כיווני המשמש לקריאת הערכים. | זרם קלט | הוצאת שוויון תוספת |
פלט איטרטור | זהו גם איטרטור חד כיווני אך משמש להקצאת הערכים. זה לא יכול לגשת לערכים. | זרם פלט | תוספת דהור (כתוב בלבד) |
איטרטורים קדימה | זה יכול לגשת וכן להקצות את הערכים. זהו השילוב של קלט ופלט איטרטור. | COUNDORM_LIST UNORDERED_MAP UNORDERED_SET | הוצאת שוויון תוספת |
איטרטורים דו כיווניים | זה יכול לנוע לשני הכיוונים קדימה או אחורה. המכולות כמו Set List ו- MultiMap תומכות באיטרטורים דו כיווניים. | רשימת מפות הגדרת multimap multiset | השבת שוויון תוספת/ירידה |
איטראטורים לגישה אקראית | איטרטורים עם גישה אקראית הם איטרטורים שניתן להשתמש בהם כדי לגשת לאלמנטים במרחק מהאלמנט שהם מצביעים על כך להציע את אותה פונקציונליות כמו עצות. | מיתרי מערך Deque Vector מחרוזת דומה | כֹּל |
כפי שאולי שמנו לב מהטבלה שלמעלה מלבד איטורי הקלט והפלט כשאנחנו יורדים בטבלה, סוג ה- iTerator מכיל את התכונות של איטרטור לעיל יחד עם כמה תכונות חדשות.
מתאמי איטרטור
מתאמי איטרטור ב- C ++ הם הסוג המיוחד של איטרטורים הבנויים על פני איטרטורים מסורתיים כדי לספק פונקציונליות מיוחדת. ישנם מתאמי איטרטור רבים ב- C ++ שחלקם ניתנים להלן:
סוג מתאמי איטרטור | תֵאוּר |
|---|---|
איטרטור הפוך | איטרטור ההפוך בנוי על פני מפעיל דו כיווני או מעל סוג המפעיל ומאפשר למשתמשים לחצות את המכולה בכיוון ההפוך. |
זרם איטרטורים | איטרטורי הזרם, כלומר איטרטורי זרם ואוסטרם בנויים על איטרטורי הקלט והיציאה בהתאמה. איטרטורים אלה מאפשרים למשתמשים להשתמש בזרמים כמכולות. |
להזיז איטרטורים | איטראטורים מהלך משמשים להכנסת סמנטיקה מהלך באלגוריתמי STL. איטרטורי המהלך מעבירים את הבעלות על נתוני המכולות המועתקים למכולה ההעתקה מבלי ליצור את העותקים הנוספים. |
איטרטור הכניסה | איטרטורי המנחם מאפשרת לך להכניס את האלמנטים הנתונים למיקום כלשהו במיכל. ישנם שלושה איטטורים של מנסח ב- C ++:
ניתן ליצור איטרטורים אלה באמצעות back_inserter () front_inserter () לְהַכנִיס() פונקציות ב- C ++. |
פונקציות שירותי איטרטור ב- C ++
C ++ STL מספקים את הפונקציה השונה כדי לפשט את העבודה עם איטרטורים. הם מופיעים בטבלה שלהלן:
| פוּנקצִיָה | תֵאוּר | תַחבִּיר |
|---|---|---|
| STD :: מקדמה | מקדם איטרטור על ידי מספר ספציפי של עמדות. | לְקַדֵם (( זה n ) |
| STD :: הבא | מחזיר את האיטרטור שהוא מספר מוגדר של עמדות לפני האיטרטור הנתון. | הַבָּא (( זה n ) |
| Std :: prev | מחזיר את האיטרטור שהוא מספר מוגדר של עמדות מאחורי האיטרטור הנתון. | Prev (( זה n ) |
| STD :: מרחק | מחזיר את מספר האלמנטים בין שני איטרטורים. | מֶרְחָק (( IT1 IT2 ) |
| STD :: התחל | מחזיר איטרטור לאלמנט הראשון של המכולה הנתונה. | לְהַתְחִיל (( מְכוֹלָה ) |
| STD :: סוף | מחזיר איטרטור לאלמנט בעקבות האלמנט האחרון של המכולה הנתונה. | סוֹף (( מְכוֹלָה ) |
| STD :: RBEGIN | מחזיר איטרטור הפוך לאלמנט האחרון של המכולה הנתונה. | RBEGIN (( מְכוֹלָה ) |
| STD :: Rend | מחזיר איטרטור הפוך לאלמנט שקדמו לאלמנט הראשון של המכולה הנתונה. | עושה (( מְכוֹלָה ) |
| STD :: Inserter | יוצר איטרטור תוספות שמכניס אלמנטים למכולה במצב מוגדר. | מַתקֵעַ (( מיקום מיכל ) |
| std :: back_inserter | יוצר איטרטור מוסיף גב שמוסיף אלמנטים לסוף המכולה. | back_inserter (( מְכוֹלָה ) |
| std :: front_inserter | יוצר איטרטור מוסיף קדמי שמכניס אלמנטים בקדמת המכולה. | Front_inserter (( מְכוֹלָה ) |
יישומי איטרטורים עם דוגמאות
איטרטורים משמשים בהרחבה ב- C ++ למטרות רבות ושונות תוך עבודה עם מכולות STL ואלגוריתמים. להלן כמה יישומים ראשוניים של איטרטורים ב- C ++ שדוגמאות הקוד שלהם:
חציית מכולות
חציית מכולות STL היא היישום הבסיסי ביותר של איטרטורים. בכך אנו משתמשים בפונקציות התחלה () ובסיום () כדי לגרום לאיטרטורים של התחלה וסוף לחצות את כל המכולה. בעיקרון אנו ממשיכים להגדיל את איטרטור ההתחלה עד שהוא לא שווה לסוף.
דוּגמָה
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 :: מצא () ו- 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 :: מרחק () איטרטורים עוזרים לחשב את מספר האלמנטים בין שני עמדות במיכל.
- איטרציה של זרם: איטרטורי זרם מאפשרים לך לטפל בזרמי קלט/פלט כמו מכולות שמקל על הקריאה והכתבים לזרמים באמצעות אלגוריתמי STL.
- העבר סמנטיקה באלגוריתמי STL: Move Iterators מציג את סמנטיקה מהלך באלגוריתמי STL המסייעים בהגברת הביצועים והיעילות על ידי הימנעות מהעתקה מיותרת. הנתונים יועברו על פי כללי סמנטיקה של מעבר.
- איטרטורים מותאמים אישית למבני נתונים: ניתן ליישם איטרטורים מותאמים אישית עבור מבני נתונים שאינם STL כמו עצים או גרפים כדי לספק את התמיכה באלגוריתמי STL ותכונות רבות אחרות. יתכן ונצטרך לעקוב אחר מספר כללים ומוסכמות כדי לספק ירידה מתגברת מתאימה ופעולות אחרות.