Menu
Coddy logo textTech

איטרטורי קלט

שיעור 14 מתוך 23 בקורס C++ - ספריית התבניות הסטנדרטית של Coddy.

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

כפי שאפשר לראות, איטרטור קדימה, איטרטור דו־כיווני ואיטרטור גישה אקראית הם כולם איטרטורי קלט תקפים.


לכן נלמד על התכונות של איטרטור קלט.


  • אופרטור שוויון/אי־שוויון
    אפשר להשוות איטרטור קלט באמצעות אופרטור שוויון או אי־שוויון. שני האיטרטורים שווים רק כאשר שניהם מצביעים לאותו מיקום. 
A == B // שוויון
A != B // אי־שוויון

נראה דוגמה שבה נבדוק אם שני איטרטורים מצביעים לאותו מיקום.

vector<int> numbers = {1, 2, 3, 4, 5};
vector<int>::iterator it1, it2;

it1 = numbers.begin();
it2 = numbers.begin() + 1;

if(it1 == it2)
	cout << "Both iterators are equal.";
else
	cout << "Both iterators are not equal.";
Output:
Both iterators are not equal.

בדוגמה שלמעלה אנחנו מצהירים על איטרטורים בשם it1 ו-it2 באמצעות vector<int>::iterator. לאחר מכן הקצינו להם ערכים. לאיטרטור it1 יש את המיקום של האיבר הראשון באמצעות המתודה begin(). ולאיטרטור it2 יש את המיקום של האיבר השני, מכיוון שהגדלנו את הערך שמחזירה המתודה begin() באחד. לכן הפלט של התוכנית אומר ששני האיטרטורים אינם זהים.


  • ביטול הפניה
    אפשר לבטל הפניה של איטרטור קלט באמצעות האופרטור *. אם נפיק את הערך שאליו האיטרטור מפנה, נקבל את הערך בפועל של האיבר שאליו האיטרטור מצביע.
*A // בצע ביטול הפניה באמצעות *
vector<int> numbers = {1, 2, 3, 4, 5};
vector<int>::iterator it1, it2;

it1 = numbers.begin();
it2 = numbers.begin() + 1;

cout << *it1 << endl;
cout << *it2;
Output:
1
2

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


  • ניתן לקידום
    אפשר לקדם איטרטור קלט, כך שאחרי הקידום הוא יפנה לאיבר הבא ברצף. לשם כך נשתמש באופרטור ++
A++ // אופרטור הגדלה לאחר השימוש בערך
++A // אופרטור הגדלה לפני השימוש בערך
vector<int> numbers = {1, 2, 3, 4, 5};
vector<int>::iterator it1;

it = numbers.begin();
cout << "First value is: " << *it << " ";

it++;
cout << "Second value is: " << *it << " ";

++it;
cout << "Third value is: " << *it;
Output:
1 2 3

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


  • ניתן להחלפה
    אפשר להחליף בין שני איטרטורים שמצביעים למיקומים שונים. אפשר לעשות זאת באמצעות משתנה זמני, כמו בדוגמה שלהלן.
vector<int> numbers = {1, 2, 3, 4, 5};
vector<int>::iterator it1, it2, temp;

it1 = numbers.begin();
it2 = numbers.begin() + 1;

cout << *it1 << " " << *it2 << endl;

temp = it1;
it1 = it2;
it2 = temp;

cout << *it1 << " " << *it2 << endl;
Output:
1 2
2 1

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

challenge icon

אתגר

בינוני

בהינתן 5 מספרים מהקלט, השתמש בווקטור ושמור בו את הערכים. לאחר מכן, השתמש באיטרטור עם המתודה begin() ועבור על הווקטור תוך הגדלת האיטרטור בכל איטרציה של הלולאה.

 

Input
10
20
30
40
50
Output
10 20 30 40 50

נסו בעצמכם

#include <vector>
#include <iostream>

using namespace std;

int main()
{
    vector<int> numbers;
    vector<int>::iterator it;

    // Enter your code here

    for(it = ; it != numbers.end(); )
    {
        
    }

    return 0;
}

כל השיעורים ביחידה C++ - ספריית התבניות הסטנדרטית

תרגלו בעצמכם: קומפיילר C++ אונליין