2011-08-04 23 views
27

मान लीजिए की एक विशेष स्थिति के लिए इटरेटर प्राप्त करने के लिए मैं एककैसे एक वेक्टर

std::vector<int> v 
//and ... 
for(int i =0;i<100;++i) 
v.push_back(i); 

अब मैं चाहता हूँ पुनरावर्तक के लिए, के वेक्टर की 10 वीं तत्व मान लीजिए की है।

इस रूप में निम्नलिखित दृष्टिकोण

std::vector<int>::iterator vi; 
vi = v.begin(); 
for(int i = 0;i<10;i++) 
    ++vi; 

कर एक सदिश के लिए रैंडम एक्सेस इटरेटर होने का लाभ खराब होगा बिना

+0

[सी ++ एसटीएल वेक्टरों का संभावित डुप्लिकेट: इंडेक्स से इटरेटर प्राप्त करें?] (Http://stackoverflow.com/questions/671423/c-stl-vectors-get-iterator-from-index) –

उत्तर

35

बस इटेटरेटर में 10 जोड़ें। वे पॉइंटर्स की तरह "महसूस" करने का इरादा रखते हैं।

+0

धन्यवाद .. यह सहायक था –

+1

क्या आप 9 जोड़ना नहीं चाहते हैं? 1 तत्व को 0 तत्वों को जोड़ना, दूसरे तत्व, पर 1 चाल जोड़ना ... एन-1 पंक्तियों को एनएच तत्व में जोड़ना। – Shillard

+0

यह चालाक है। :-) –

46

यह vector से इस तरह के रूप में एक या deque किसी भी यादृच्छिक अभिगम इटरेटर के साथ काम करेंगे:

std::vector<int>::iterator iter = v.begin() + 10; 

आप एक समाधान है कि इटरेटर के किसी भी प्रकार के लिए काम करेंगे चाहते हैं, का उपयोग next:

std::vector<int>::iterator iter = std::next(v.begin(), 10); 

या आप एक सी ++ 11 कार्यान्वयन, advance पर नहीं कर रहे हैं, तो:

std::vector<int>::iterator iter = v.begin(); 
std::advance(iter, 10); 
+0

धन्यवाद ... अब मेरे लिए 10 काम जोड़ रहे हैं। लेकिन मैं अग्रिम के लिए नोट लेगा। –

+1

मैं std :: अग्रिम() पसंद करूंगा क्योंकि यह किसी भी इटरेटर के साथ काम करता है; इस तरह आप एक विशिष्ट कंटेनर से बंधे नहीं हैं। –

+0

@ मैट: सभी संभावनाओं में, यदि आपके एल्गोरिदम को एनएच-एलिमेंट एक्सेस की आवश्यकता है, तो यह यादृच्छिक-एक्सेस इटरेटर्स के अलावा किसी भी चीज़ के साथ बेकार रूप से अक्षम होगा; इसलिए वास्तव में 'std :: advance' के बजाय' ऑपरेटर + 'का उपयोग करना बेहतर होगा और गलत इटरेटर प्रकार के साथ एक कंपाइलर त्रुटि प्राप्त करें। – ildjarn