2009-06-23 7 views
34

क्या मैं इटरेटर के साथ सामान्य गणना कर सकता हूं, यानी बस एक संख्या जोड़कर इसे बढ़ाएं?क्या मैं सिर्फ एक संख्या जोड़कर एक इटरेटर बढ़ा सकता हूं?

उदाहरण के लिए, अगर मैं तत्व vec[3] निकालना चाहते हैं, मैं सिर्फ यह कर सकते हैं:

std::vector<int> vec; 
for(int i = 0; i < 5; ++i){ 
     vec.push_back(i); 
} 
vec.erase(vec.begin() + 3); // removes vec[3] element 

यह मेरे (छ ++) के लिए काम करता है, लेकिन मुझे यकीन है कि अगर यह गारंटी है नहीं कर रहा हूँ काम करने के लिए।

उत्तर

42

यह काम करता है अगर इटरेटर एक यादृच्छिक अभिगम इटरेटर, जो वेक्टर के iterators हैं (reference देखें)। एसटीएल फ़ंक्शन std::advance का उपयोग सामान्य जेनरेटर को अग्रिम करने के लिए किया जा सकता है, लेकिन चूंकि यह इटेटरेटर नहीं लौटाता है, इसलिए मैं उपयोग करता हूं + अगर उपलब्ध हो क्योंकि यह क्लीनर दिखता है।

सी ++ 11 टिप्पणी

अब std::next और std::prev, जो , इटरेटर वापसी करना इसलिए यदि आप टेम्पलेट देश में काम कर रहे हैं आप एक सामान्य इटरेटर अग्रिम करने के लिए उन्हें इस्तेमाल करते हैं और अभी भी हो सकता है है साफ कोड

+7

ओह, तो यह std :: सूची के लिए काम नहीं करेगा? – Frank

+2

सही; कुछ दस्तावेज लिंक जोड़े गए हैं जो सूचीबद्ध करते हैं कि कौन से फ़ंक्शंस इस प्रकार के इटरेटर के लिए उपलब्ध होना चाहिए। –

+1

नहीं, यह नहीं है। + ऑपरेटर का मतलब है "एक कदम में, इसे बहुत दूर कूदें" जो एक सूची इटरेटर नहीं कर सकता है। अग्रेषित गैर-यादृच्छिक-पहुंच इटरेटर्स (जैसे सूची इटरेटर) समर्थन केवल एक तत्व को अग्रिम करने के लिए वृद्धि (++) ऑपरेटर का समर्थन करता है। जैसा कि टोड ने कहा था, आप std :: अग्रिम का उपयोग कर सकते हैं, जो ++ ऑपरेटर को बार-बार आमंत्रित करता है, संक्षेप में गैर-यादृच्छिक पुनरावर्तक को कई चरणों से आगे बढ़ाने के विचार को व्यक्त करता है। –

2

यह रैंडम एक्सेस iterators के साथ काम करता है। आम तौर पर आप std::advance को देखना चाहते हैं जो अधिक सामान्य है। बस इस फ़ंक्शन टेम्पलेट का उपयोग करने के प्रदर्शन प्रभावों को समझना सुनिश्चित करें।

संबंधित मुद्दे