עבור לתוכן

איטרטור (iterator) וSTL

Featured Replies

פורסם

מה זה איטרטור?

ובבקשה אל תגידו לי שזה משמש למעבר על אוסף של אובייקטים כי זה לא ממש עוזר לי...

ואיפה אני יכול למצוא מה יש בSTL?

פורסם

אבל זה מה שזה :)

זה כמו שיש לך רכבת עם קרונות ובכניסה לכל קרון יש סיסמא שהיא דומה בכולם (אותו טיפוס)

ויש אדם שיודע את הסיסמא ומכיר את הרכבת (הקונטיינר) וכאשר נותנים לו פקודה הוא עובר בין הקרונות ועושה בהן פעולה מסויימת (אותה פעולה)

זה מין פוינטר שיודע לטייל בין האיברים של הקונטיינר שבעזרתו אתה מקבל גישה לכל אחד מה"קרונות"

הפוינטר הזה מכיר את הקרונות , יודע את המרחק בניהם ויודע את סיסמאת הכניסה , לכן יש לו את האפשרות לדלג בניהם.

לדוגמא לקונטיינר STL וקטור, יש איטרטור משלו לדוגמא מסוג אינטג'ר, זהו איטרטור שיודע לטייל על וקטור שמכיל אינטג'רים

הוא מכיר את הקונטיינר וקטור (הרכבת) ויודע את המרחק בין קרון לקרון (מרחק בין אינטג'ר לאינטג'ר) לכן הוא יודע לאן לגשת ובאיזה עוצמה "לקפץ" בין קרון לקרון

בעזרתו אתה יכול לגשת לכל קרון שאתה רוצה באותה הרכבת ולעשות בקרון פעולות או להוציא ממנו מידע.

ניסיתי כמה שיותר ציורי

מקווה שעזר ולא בילבל אותך עוד יותר ;)...

מידע על STL :

http://www.cplusplus.com/reference/stl/

פורסם

http://en.wikipedia.org/wiki/Iterator_pattern

מה אתה רוצה לדעת בדיוק לגבי איטרטור?

איטרטור נועד למקרים שאתה רוצה לעבור על אוסף של אובייקטים, ואתה לא יכול להשתמש באינדקס. כשאתה עובר על אובייקטים ברשימה מאונדקסת (כמו מערך או vector) אז אתה יכול לגשת לאיברים ברשימה על פי המיקום שלהם, ולכן לרוץ עליה באמצעות אינדקס:

for (int i = 0 ; i < myVector.size() ; i++)
{
// do something with myVector[i]
}

אבל מה קורה כשהאוסף שלך לא מאונדקסת (קרי, אתה לא יכול לגשת לאיבר ה-i ברשימה)? זה נכון כשיש לך רשימה מקושרת או אוספים לא סדורים, כגון map ו-set. במקרים כאלה, אתה צריך איטרטור כדי לעבור על האוסף:

for (list<int>::iterator iter = myList.begin() ; iter != myList.end() ; iter++)
{
// do something with (*iter)
}

חוץ מזה, איטרטור הוא דבר יחסית גנרי. יש פונקציות וקלאסים ב-STL שנועדו לטפל באוספים מכל מיני סוגים, בלי חשיבות לטיפוס הספציפי שלהם. קח לדוגמה את הפונקציה count. הפונקציה סופרת את מספר האיברים באוסף מסוים שזהים לאובייקט נתון כלשהו. על מנת לא להגביל אותנו לטיפוס של האוסף, הפונקציה מקבלת פשוט איטרטור לתחילת האוסף ולסופו, ורצה עליהם. ככה היא יכולה לקבל איטרטור של map, vector, list ואפילו סתם של מערך (בהגדרה, מצביע הוא איטרטור למערך).

לגבי STL, בנוסף ללינק שניתן מעליי, יש גם את זה:

http://www.cppreference.com/index.html

וגם ב-MSDN יש הרבה מידע:

http://msdn.microsoft.com/en-us/library/cscc687y.aspx

פורסם

ההסבר שלי יותר ידידותי ;)

במיוחד עצם זה שהכנסת לו את המושג " design pattern " לנושא פעוט כמו איטרטור STL-י.

בשביל להבין מה זה הiterator pattern צריך קודם להבין מה זה איטרטור.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים