2010-06-01 13 views
6

मुझे एक डेक तत्व की अनुक्रमणिका को cout और वापस करने की आवश्यकता है जो एक इटेटरेटर इंगित कर रहा है। मैं एक इटेटरेटर से बाहर कैसे निकल सकता हूं?सी ++ में, मैं एक पुनरावर्तक की एक int अनुक्रमणिका कैसे प्राप्त करूं?

+0

आपको इंडेक्स की आवश्यकता क्यों है? क्या आप ऑब्जेक्ट को केवल अपमानित नहीं कर सकते हैं और उस पर इटेटरेटर अंकगणित कर सकते हैं? –

+0

कैसा है? इटेटरेटर को डिफ्रेंस करने की तरह ही एक पॉइंटर को डिफ्रेंस करने की तरह नहीं होगा और मुझे मेमोरी पता दे, डेक में स्थान नहीं? – user83

उत्तर

3
std::ptrdiff_t index = std::distance(myDeque.begin(), curIterator); 
9

आप उपयोग कर सकते हैं:

std::ptrdiff_t index(std::distance(my_container.begin(), my_iterator)); 

इस तरह के एक दिनचर्या के क्रम लागत से सावधान रहें, however- यह आप का उपयोग डेटा संरचना पर निर्भर करता है।

+1

या इसके बजाय यह इटरेटर (यादृच्छिक, आगे, इत्यादि) पर निर्भर करता है –

+0

मैं नंबर खोजने के लिए कंटेनर के प्रत्येक तत्व के माध्यम से दूरी कदम मान रहा हूं, इसलिए रनकटाइम लागत एक बड़ी डेक बड़ी होगी। हालांकि, मेरे डेक 10 तत्वों से बड़ा नहीं होना चाहिए। और दूरी एक int वापस करता है? इंडेक्स() कॉल क्या करता है? – user83

+0

यदि आपके डेक में 10 से अधिक तत्व नहीं होने चाहिए तो मैं प्रस्तुत करता हूं कि आपको इसके बजाय 'वेक्टर' का उपयोग करना चाहिए, या कम से कम डेक के साथ चिपकने के लिए एक अच्छा तर्क होना चाहिए। इंडेक्स() "कॉल" केवल 'वैरिएबल' नामक रिटर्न वैल्यू के साथ निर्मित 'इंडेक्स' नामक एक चर है। – fbrereto

4

यादृच्छिक अभिगम iterators के लिए आप सिर्फ घटाव का उपयोग कर सकते हैं:

size_t index = some_iterator - some_deque.begin() 

जाहिर है इस (। std::list या जो कुछ भी के लिए उदाहरण के लिए) सभी iterators के लिए काम नहीं करता है, लेकिन मैं प्रस्तुत करता हूँ वहाँ में एक निश्चित लालित्य है कि कि आप केवल इस तकनीक का उपयोग कर सकते हैं जब इसमें निरंतर समय लगेगा। यदि आपके कंटेनर में यादृच्छिक अभिगम इटरेटर्स नहीं हैं तो शायद उन्हें इंडेक्स को खोजने की कोशिश करने के लिए समझदारी नहीं है।

+0

मुझे लगता है कि मैं इसे अपनी सादगी और लालित्य के लिए सबसे अच्छा जवाब देने जा रहा हूं। क्या मैं परिणाम को एक इंट को सौंप सकता हूं ताकि इसे एक int में डाला जा सके? – user83

+0

आप इसे एक int में असाइन कर सकते हैं, लेकिन आपको शायद उच्च चेतावनी स्तर (या तो हस्ताक्षरित-> हस्ताक्षरित रूपांतरण या प्रकार की वास्तविक शॉर्टिंग, कंपाइलर आदि के आधार पर एक कंपाइलर चेतावनी मिल जाएगी)।यह स्पष्ट रूप से int को डालने के लिए थोड़ा परेशान है, लेकिन यह तब तक एक समस्या को छिपाने वाला नहीं है जब तक कि आपके डेक में 2 अरब से अधिक तत्व नहीं होंगे - जो मुझे लगता है कि आप निश्चित रूप से सुनिश्चित होंगे कि आप नहीं करेंगे :) – Peter

2
दो प्रस्तुत तरीकों में से

:

std::ptrdiff_t index(std::distance(my_container.begin(), my_iterator)); 

और

std::ptrdiff_t index = some_iterator - some_deque.begin() 

... उत्तरार्द्ध केवल रैंडम एक्सेस iterators के लिए लागू किया जा रहा है की श्रेष्ठता है - जब एक और कंटेनर के लिए प्रतिस्थापन इसलिए , आप आकस्मिक रूप से उदाहरण के लिए सूचियों के लिए एक महंगा ऑपरेशन (ओ (एन) प्राप्त नहीं करेंगे)।

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