Free tutorials & notes in Hindi & English · Clean code examples 🧰 मुफ़्त PDF और फ़ोटो टूल्स →
🔴 Advanced  ·  Lesson 58

Iterators in STL

Iterator क्या है?

Iterator एक object है जो container के किसी element की ओर इशारा करता है और अगले element पर जाना जानता है। यह pointer की तरह व्यवहार करता है:

  • *it — जिस element की ओर इशारा है
  • ++it — अगले element पर जाओ
  • it == other — क्या दोनों एक ही position पर हैं?

Iterators STL को जोड़ने वाली कड़ी हैं: containers iterators देते हैं, और sort, find, reverse जैसे algorithms iterators की किसी भी जोड़ी पर काम करते हैं। इसीलिए एक ही algorithm vector, list या deque पर चलता है।

begin() और end()

हर container में होता है:

  • begin() — पहले element का iterator
  • end() — आख़िरी के एक बाद वाला iterator
Text
 vector:  [ 78 | 91 | 66 | 84 ]
            ^                  ^
         begin()             end()   (आख़िरी element के बाद)

Half-open range [begin, end) से loops आसान बनते हैं — end() पर पहुँचते ही रुकें — और खाली container में begin() == end() होता है।

Iterator से loop

C++
#include <iostream>
#include <vector>

int main() {
    std::vector<int> marks = {78, 91, 66, 84};

    // पूरा iterator type
    for (std::vector<int>::iterator it = marks.begin(); it != marks.end(); ++it) {
        *it += 2;                       // grace marks: element बदलता है
    }

    // वही काम auto से (C++11)
    for (auto it = marks.begin(); it != marks.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << "\n";

    // range-based for पीछे से iterators ही इस्तेमाल करता है
    for (int m : marks) std::cout << m << " ";
    std::cout << "\n";
    return 0;
}
80 93 68 86 80 93 68 86

हर element चाहिए हो तो range-based for सबसे आसान है। Position चाहिए, loop में erase करना हो, या algorithm को range देनी हो — तब explicit iterators लें।

Iterators की पाँच categories

Categoryक्या कर सकता हैकौन देता है
Inputएक बार पढ़ना, आगे बढ़ना (*it, ++it)istream_iterator
Outputएक बार लिखना, आगे बढ़नाostream_iterator, back_inserter
Forwardपढ़ना/लिखना, कई बार आगे बढ़नाforward_list, unordered_map
BidirectionalForward + पीछे जाना (--it)list, set, map
Random-accessBidirectional + छलांग (it + 3, it[2], it2 - it1, <)vector, deque, array, साधारण pointers

हर category में ऊपर वाली की सारी क्षमताएँ होती हैं। Algorithm अपनी न्यूनतम ज़रूरत बताता है — std::sort को random-access iterators चाहिए, इसीलिए list का अपना list.sort() है।

const और reverse iterators

C++
#include <iostream>
#include <vector>

int main() {
    std::vector<int> v = {1, 2, 3, 4, 5};

    for (auto it = v.cbegin(); it != v.cend(); ++it) {   // const_iterator
        std::cout << *it << " ";        // *it = 9; compile नहीं होगा
    }
    std::cout << "\n";

    for (auto it = v.rbegin(); it != v.rend(); ++it) {   // reverse_iterator
        std::cout << *it << " ";
    }
    std::cout << "\n";
    return 0;
}
1 2 3 4 5 5 4 3 2 1

सिर्फ पढ़ना हो तो cbegin()/cend() लें, ताकि compiler गलती से बदलाव रोक दे। rbegin()/rend() उल्टी दिशा में चलते हैं।

काम के iterator functions

Functionअर्थ
std::next(it, n)n कदम आगे का iterator (default 1)
std::prev(it, n)n कदम पीछे का iterator
std::advance(it, n)it को ही n कदम खिसकाओ
std::distance(a, b)a से b तक कितने कदम

ये हर category के लिए चलते हैं, list के लिए भी, जहाँ it + 3 allowed नहीं।

C++
std::vector<int> v = {10, 20, 30, 40};
auto it = std::find(v.begin(), v.end(), 30);
std::cout << "index = " << std::distance(v.begin(), it) << "\n";   // 2
std::cout << "last  = " << *std::prev(v.end()) << "\n";            // 40

Map पर iterators

map का iterator एक pair की ओर इशारा करता है: ->first key है और ->second value।

C++
std::map<std::string, int> marks = {{"Aman", 78}, {"Priya", 91}};
for (auto it = marks.begin(); it != marks.end(); ++it) {
    std::cout << it->first << ": " << it->second << "\n";
}

Iterator invalidation

Container बदलने पर मौजूदा iterators invalid (dangling) हो सकते हैं:

ContainerOperationकौन-से iterators invalid होते हैं
vectorpush_back, insert (reallocation के साथ)सभी
vectoreraseहटाए गए element पर और उसके बाद वाले
dequeकिसी भी सिरे पर insertसभी iterators (references valid रहते हैं)
list, set, maperaseसिर्फ हटाए गए element का iterator

Loop में सुरक्षित erase — erase से मिला iterator इस्तेमाल करें:

C++
std::vector<int> marks = {35, 20, 50, 12, 40};
for (auto it = marks.begin(); it != marks.end(); ) {
    if (*it < 33) it = marks.erase(it);   // erase अगला valid iterator लौटाता है
    else ++it;
}
// marks: 35 50 40

(Vectors के लिए C++20 का आसान तरीका: std::erase_if(marks, [](int m){ return m < 33; });।)

आम गलतियाँ

  • end() या खाली container के iterator को dereference करना।
  • दो अलग containers के iterators की तुलना करना।
  • list या map iterator पर it + 1 लिखना — std::next(it) लें।
  • Vector पर push_back के बाद पुराना iterator रखे रहना।
  • erase वाले loops में it++ गलत जगह लिखकर elements छोड़ देना।
🏋️ अभ्यास

list<int> में 10 numbers भरें। सिर्फ iterators से उसे सीधा और उल्टा print करें, std::find_if से 50 से बड़ा पहला number खोजें, std::distance से उसकी position print करें, और हर even number सुरक्षित तरीके से हटाएँ।

सारांश

  • Iterator element की ओर इशारा करता है और pointer की तरह container में चलता है।
  • begin() पहला element है; end() आख़िरी के एक बाद — उसे कभी dereference न करें।
  • Categories: input, output, forward, bidirectional, random-access।
  • सिर्फ पढ़ने के लिए cbegin/cend, उल्टी दिशा के लिए rbegin/rend।
  • Container बदलने से iterators invalid हो सकते हैं; erase से मिला iterator लें।

संबंधित: STL परिचय, vector, algorithms, list और deque।

अक्सर पूछे जाने वाले प्रश्न (FAQ)

C++ में iterator क्या है?
Iterator एक object है जो container के अंदर किसी element की ओर इशारा करता है और अगले element पर जा सकता है। यह generalised pointer की तरह है: *it element देता है, ++it आगे बढ़ाता है, और end() से तुलना बताती है कि कब रुकना है। sort और find जैसे algorithms iterators लेकर तय करते हैं कि किस range पर काम करना है।
C++ में end() क्या लौटाता है?
end() आख़िरी element के ठीक बाद वाली position का iterator लौटाता है, आख़िरी element का नहीं। यह बताता है कि range कहाँ रुकती है। end() को dereference करना undefined behaviour है; आख़िरी element के लिए std::prev(v.end()) या v.back() लें।
C++ में iterators कितने प्रकार के होते हैं?
Classic categories हैं input, output, forward, bidirectional और random-access iterators। vector और deque random-access iterators देते हैं (it + 5 चलता है), list, set और map bidirectional iterators देते हैं (सिर्फ ++ और --), और stream iterators input या output iterators होते हैं।
Iterator invalidation क्या है?
जब container ऐसे बदलता है कि iterator जिस element की ओर इशारा कर रहा था वह हिल जाए या हट जाए, तो iterator invalid हो जाता है। vector में push_back memory बदल सकता है और सारे iterators invalid कर सकता है, और erase हटाई गई position और उसके बाद के iterators invalid करता है। Invalid iterator इस्तेमाल करना undefined behaviour है।
← Back to C++ Tutorial
🔗

Share this topic with a friend

यह topic किसी दोस्त को भेजें

Found it useful? Send it to a classmate learning the same thing.

अच्छा लगा? जो दोस्त यही सीख रहा है, उसे भेज दीजिए।

💻 लाइव कोड एडिटर

इस पेज के प्रोग्राम यहीं तैयार हैं — चलाएँ, बदलें और सीखें। कुछ भी इंस्टॉल किए बिना।
OneCompiler द्वारा संचालित। कोड एडिटर में अपने आप आ जाता है — Run दबाकर आउटपुट देखें। अगर एडिटर न खुले तो नए टैब में खोलें.
अगला topicSTL Algorithms आपकी प्रगति: 58 / 81 (72%) · Lesson 59 / 81 आगे बढ़ें →

यह lesson कैसा लगा?

आपकी राय से हम content और बेहतर बनाते हैं।

अपना review और सुझाव लिखें (वैकल्पिक)

Review approve होने के बाद आपका नाम और शहर इसके साथ public दिख सकते हैं। Email या phone न लिखें।

▶ CodingEasily on YouTube

Video से सीखें – आसान Hindi में

चुनी हुई video: RDBMS भाग 3 – Class XI Commerce IT

▶ Channel subscribe करें