2011-02-03 19 views
36

मेरे पास छात्र का वेक्टर है जिसमें फ़ील्ड का नाम है।मैं एक कॉन्स्टेंट वेक्टर पर कैसे पुन: प्रयास करूं?

मैं वेक्टर पर फिर से शुरू करना चाहता हूं।

void print(const vector<Student>& students) 
    { 
    vector<Student>::iterator it; 
    for(it = students.begin(); it < students.end(); it++) 
     { 
      cout << it->name << endl; 
     } 
    } 

यह स्पष्ट रूप से सी ++ में अवैध है।

कृपया मदद करें।

+2

कृपया बनाम उपसर्ग के बारे में पढ़ा पोस्टफिक्स वृद्धि ऑपरेटर। 'यह ++ 'होना चाहिए' ++ ', और दुर्लभ मामलों में' ++ 'की आवश्यकता होती है (यानी जब पुनरावृत्ति करते समय मिटाना)। –

+2

यह स्पष्ट रूप से स्पष्ट है कि इस मामले में समस्या क्या है। हालांकि, भविष्य में आपको अपने प्रश्न में कंपाइलर आपको सही त्रुटि संदेश शामिल करना चाहिए। –

उत्तर

53

आपके पास दो विकल्प (सी ++ 11 में तीन) है const_iterator रों और अनुक्रमित

void func(const std::vector<type>& vec) { 
    std::vector<type>::const_iterator iter; 
    for (iter = vec.begin(); iter != vec.end(); ++iter) 
    // do something with *iter 

    /* or 
    for (size_t index = 0; index != vec.size(); ++index) 
    // do something with vec[index] 

    // as of C++11 
    for (const auto& item: vec) 
    // do something with item 
    */ 
} 

आप को प्राथमिकता देनी चाहिए (+ C++ 11 "सीमा-के लिए") != बजाय का उपयोग कर < iterators के साथ - उत्तरार्द्ध सभी iterators, पूर्व इच्छा के साथ काम नहीं करता है। पूर्व के साथ आप भी कोड अधिक सामान्य बना सकते हैं

template<typename Container> 
void func(const Container& container) { 
    typename Container::const_iterator iter; 
    for (iter = container.begin(); iter != container.end(); ++iter) 
    // work with *iter 
} 
+0

मैं iterators के लिए नया हूँ। क्या आप कृपया मुझे बता सकते हैं कि इटेटरेटर पसंद नहीं करते हैं! = और क्यों? – unj2

+4

@ कुंजान: केवल यादृच्छिक अभिगम इटरेटर्स ऑर्डरिंग का समर्थन करते हैं ('<'), अन्य नहीं। उदाहरण के लिए, std :: सूची में द्वि-दिशात्मक इटरेटर्स हैं, जिन्हें केवल समानता के लिए तुलना की जा सकती है। –

16

इसके बजाय const_iterator का उपयोग करें। iteratorvector के संशोधन की अनुमति देता है, इसलिए आप const कंटेनर से एक नहीं प्राप्त कर सकते हैं।

इसके अलावा, इस लूप को लिखने का बेवकूफ तरीका < के बजाय it != students.end() का उपयोग करता है (हालांकि यह vector पर काम करना चाहिए)।

+2

... लेकिन यदि आपने कभी भी 'सूची' या इसके समान कुछ उपयोग करने के लिए बदलने का निर्णय लिया है, तो आपका कोड काम नहीं करेगा। तो '! =' फॉर्म का उपयोग करें। –

2
void print(const vector<Student>& students) 
    { 
    vector<Student>::const_iterator it; // const_iterator 
    for(it = students.begin(); it != students.end(); it++) 
     { 
      cout << it->name << endl; 
     } 
    } 
3
vector<Student>::iterator के बजाय

, vector<Student>::const_iterator का उपयोग करें।

2
void print(const vector<Student>& students) 
    { 
    for(auto it = students.begin(); it != students.end(); ++it) 
     { 
      cout << it->name << endl; 
     } 
    } 
+1

इस प्रश्न को टैग नहीं किया गया है C++ 0x – smerlin

+2

लेकिन हमें उस सुविधा के बारे में याद रखना अच्छा लगता है, शायद हमें C++ 11 पर स्विच करने के लिए प्रोत्साहित करना। +1 – Offirmo

1

सी ++ 11 शैली (ताकि आप भी पाश बिना छुए कंटेनर प्रकार बदल सकता है):

void print(const vector<Student>& students) { 
    for(auto const& student : students) { 
      cout << student.name << endl; 
    } 
} 
संबंधित मुद्दे