तो, मैंने कोड का एक समूह लिखा जो इंडेक्स [] द्वारा एक एसएलएल वेक्टर में तत्वों तक पहुंचता है, लेकिन अब मुझे वेक्टर के केवल एक हिस्से की प्रतिलिपि बनाने की आवश्यकता है। ऐसा लगता है कि vector.insert(pos, first, last)
वह फ़ंक्शन है जो मैं चाहता हूं ... सिवाय इसके कि मेरे पास केवल पहले और आखिरी चींटियां हैं। क्या कोई अच्छा तरीका है कि मैं इन मूल्यों के लिए एक इटरेटर प्राप्त कर सकता हूं?सी ++ एसटीएल वेक्टर: सूचकांक से इटरेटर प्राप्त करें?
उत्तर
इस प्रयास करें:
vector<Type>::iterator nth = v.begin() + index;
आम तौर पर, आप के साथ की तुलना में एसटीएल iterators के साथ एक ही गणित का उपयोग कर सकते संकेत दिए गए। एसटीएल एल्गोरिदम का उपयोग करते समय उन्हें विनिमय योग्य बनाने के लिए डिज़ाइन किया गया है। –
@VincentRobert: आसपास के अन्य तरीके। पॉइंटर्स एसटीएल यादृच्छिक iterators, सबसे शक्तिशाली श्रेणी के वैध कार्यान्वयन हैं। लेकिन अन्य, कम शक्तिशाली श्रेणियां जैसे अग्रेषित इटरेटर्स समान अंकगणित का समर्थन नहीं करते हैं। – MSalters
मैं चाहता हूं कि मैं अपने पांच सेंट को इस उत्तर में जोड़ूं और अनुशंसा करता हूं कि 'std :: अगला (v.begin(), अनुक्रमणिका) ' – stryku
रास्ता @dirkgently (v.begin() + index)
अच्छा और के लिए तेजी से वैक्टर
लेकिन std::advance
(v.begin(), index)
सबसे सामान्य तरीके से और रैंडम एक्सेस iterators के लिए भी लगातार समय काम करता है उल्लेख किया।
संपादित उपयोग में
मतभेद:
std::vector<>::iterator it = (v.begin() + index);
या
std::vector<>::iterator it = v.begin();
std::advance(it, index);
@litb नोटों के बाद जोड़ा।
std :: अग्रिम को पहले तर्क के रूप में गैर-कॉन्स्ट इटरेटर की आवश्यकता नहीं है? – goldPseudo
इस के अनुसार - http://www.sgi.com/tech/stl/advance.html - नहीं। – bayda
आप std :: अग्रिम का उपयोग कॉन्स और गैर-कॉन्स इटरेटर्स – bayda
सक्रिय रूप से std :: वेक्टर को आवश्यक होने पर सी टैब के रूप में उपयोग करने के लिए उपयोग किया जाता है। (सी ++ मानक अनुरोध करता है कि वेक्टर कार्यान्वयन के लिए, जहाँ तक मुझे पता है - replacement for array in Wikipedia) उदाहरण के लिए यह पूरी तरह इस folowing करने के लिए कानूनी है, मेरे हिसाब से:
int main()
{
void foo(const char *);
sdt::vector<char> vec;
vec.push_back('h');
vec.push_back('e');
vec.push_back('l');
vec.push_back('l');
vec.push_back('o');
vec.push_back('/0');
foo(&vec[0]);
}
बेशक
, या तो foo पते की प्रतिलिपि नहीं होना चाहिए पैरामीटर के रूप में पारित किया गया है और इसे कहीं स्टोर किया गया है, या आपको अपने प्रोग्राम में वीसी में किसी भी नए आइटम को कभी भी धक्का नहीं देना चाहिए, या इसकी क्षमता बदलने का अनुरोध करना चाहिए। या जोखिम विभाजन गलती ...
इसलिए अपने उदाहरण में यह
vector.insert(pos, &vec[first_index], &vec[last_index]);
मुझे आश्चर्य है कि उन्होंने इटरेटर को दूर करने का फैसला क्यों किया है यदि वे केवल पॉइंटर्स हैं ... वे अनिवार्य रूप से इन क्षमताओं को "छुपा रहे हैं"। – mpen
संवेदना के लिए? चूंकि यह आपको अपने कोड में किसी अन्य प्रकार के कंटेनर के लिए वेक्टर इंस्टेंस को आसानी से हटाने की अनुमति देगा। –
और वीसी [i] एक सूचक उत्पन्न करता है जो वेक्टर <> :: iterator के साथ जरूरी नहीं है। vec.begin() + उदाहरण के लिए, मुझे अभी भी आपकी लाइब्रेरी को परिभाषित करने वाला लाभ होने का लाभ है - डीबग मोड में चेक किए गए इटरेटर्स सहित। इसलिए, यदि आपको पॉइंटर की आवश्यकता नहीं है (उदाहरण के लिए I/O के लिए), तो आपको हमेशा इटरेटर पसंद करना चाहिए। – sellibitze
की ओर जाता है या फिर आप std::advance
vector<int>::iterator i = L.begin();
advance(i, 2);
भी उपयोग कर सकते हैं; auto it = std::next(v.begin(), index);
अद्यतन: एक सी ++ 11x अनुरूप संकलक की जरूरत भी
यह ध्यान दिया जाना चाहिए कि यह सी ++ 11 रास्ता है! std :: अगला std :: अग्रिम के बराबर है। अंकगणित का उपयोग करने के बजाए इन कार्यों का उपयोग करना कंटेनर प्रकारों को स्वैप करना बहुत आसान बनाता है। सी-एरेज़ afaik पर भी काम करता है, बस std :: start और std :: end की तरह। – Zoomulator
यह भी ध्यान दिया जाना चाहिए कि std :: अग्रिम बेवकूफ द्वारा डिज़ाइन किया गया है क्योंकि यह आउटपुट के रूप में संदर्भ का उपयोग करता है, न कि वापसी मूल्य। –
के लिए (ऑटो इसे = शुरू करें (सी); यह! = अंत (सी); अग्रिम (यह, एन)) {...} – Zoomulator
- 1. सी ++ एसटीएल वेक्टर इटरेटर ऑब्जेक्ट
- 2. क्या मैं एक एसटीएल :: वेक्टर :: इटरेटर
- 3. प्राप्त करें (अपने) सी में इटरेटर प्रकार ++ (एसटीएल)
- 4. एक एसटीएल इटरेटर
- 5. एसटीएल एक वेक्टर क्लोनिंग
- 6. 2-आयामी एसटीएल वेक्टर सी ++
- 7. एसटीएल मानचित्र बनाम वेक्टर के लिए इटरेटर एक्सेस प्रदर्शन?
- 8. सी ++ वर्चुअल विधि जो एसटीएल-स्टाइल इटरेटर
- 9. एक एसटीएल वेक्टर
- 10. एसटीएल इटरेटर: उपसर्ग वृद्धि तेजी से?
- 11. सी ++ एसटीएल मानचित्र बनाम वेक्टर गति
- 12. एसटीएल वेक्टर के एक अच्छा सी समकक्ष?
- 13. सी ++ एसटीएल वेक्टर: push_back संदर्भ लेने
- 14. इटरेटर अंकगणित
- 15. वेक्टर इटरेटर: 'ऑपरेटर ='
- 16. बाइनरी खोज सी ++ एसटीएल
- 17. लपेटें एसटीएल वेक्टर और इस परिवर्तन से उसकी इटरेटर के व्यवहार
- 18. सी ++ में इटरेटर से मूल्य प्रकार कैसे प्राप्त करें?
- 19. एसटीएल जोर एकाधिक वेक्टर परिवर्तन?
- 20. एसटीएल वेक्टर को कैसे सॉर्ट करें?
- 21. सी ++ एसटीएल: लापता आधार स्तरीय इटरेटर और reverse_iterator
- 22. सूचकांक द्वारा OrderedDictionary से सी # में कुंजी कैसे प्राप्त करें?
- 23. क्या एसटीएल आउटपुट इटरेटर के बराबर सी # # है?
- 24. एसटीएल का वेक्टर आकार बदलना
- 25. एसटीएल वेक्टर बनाम नक्शा मिटा
- 26. एसटीएल वेक्टर में तत्वों की सभी पदों को प्राप्त करें जो मान
- 27. सी ++ एसटीएल: ऐरे बनाम वेक्टर: कच्चे तत्व का प्रदर्शन प्रदर्शन
- 28. इटरेटर और const_iterator (एसटीएल) की विभिन्न दक्षता
- 29. सी ++ एसटीएल में एसटीएल
- 30. उपयोग सी ++ एसटीएल
देखें: http://stackoverflow.com/q/2152986/365102 –