2012-11-22 9 views
9

के माध्यम से सेट तत्व का "अनुक्रमणिका" प्राप्त करना यह प्रश्न std::set और std::unsorted_set दोनों पर लागू होता है।इटेटर

मेरे पास एक सेट में किसी तत्व के लिए एक पुनरावर्तक है। मैं सेट में अपने स्थान के आधार पर तत्व के लिए "अनुक्रमणिका" प्राप्त करने के लिए पुनरावर्तक का उपयोग करना चाहता हूं।

उदाहरण के लिए, मेरे सेट के रूप में किया जाएगा के लिए सूचकांक इस प्रकार है:

int index = 0; 

for(MySetType::iterator begin = mySet.begin(); begin != mySet.end(); begin++) 
{ 
    cout << "The index for this element is " << index; 
    index++; 
} 

मैं iterators का उपयोग कर अंकगणित कर की कोशिश की है, लेकिन यह काम नहीं करता है:

int index = mySetIterator - mySet.begin(); 

वहाँ किसी भी तरह से करने के लिए है इस तरह के इंडेक्स वैल्यू को सेट में अपने स्थान के आधार पर इटरेटर का उपयोग करें?

+0

दो iterators के बीच एक "दूरी" होने का सही तरीका [ 'std :: distance'] (http://en.cppreference.com/w/cpp/iterator/distance) कार्य है। हालांकि, कृपया इसका उपयोग करने से पहले जैक जवाब पढ़ें। –

उत्तर

13

STL distance आपको जो चाहिए वह है। std::distance(set.begin(), find_result)

कृपया ध्यान दें कि:

"पहली और आखिरी के बीच तत्वों की संख्या देता है व्यवहार अपरिभाषित है अगर पिछले द्वारा (संभवतः बार-बार) पहले से पहुंच योग्य नहीं है पहले incrementing।।"

टिप्पणी: जटिलता रैखिक है;

3

std::set और set::unordered_setसाहचर्य कंटेनर, नहीं अनुक्रम कंटेनर हैं, इसलिए सूचकांक की अवधारणा ही ज्यादा मतलब नहीं है।

यदि आपको किसी सहयोगी कंटेनर के लिए एक इंडेक्स पुनर्प्राप्त करने की आवश्यकता है तो डिजाइन को बदला जाना चाहिए (यहां तक ​​कि क्योंकि कम से कम या सबसे हालिया डालने वाले तत्व की अवधारणा के बिना ऐसे कंटेनरों में सूचकांक बदल सकते हैं)।

+0

मुझे तत्वों (iterators) को लिंक करने के लिए केवल एक "अनुक्रमणिका" की आवश्यकता है ताकि आइटम को फ़ाइल में लिखा जा सके। दूसरे शब्दों में, मेरे पास सेट इटरेटर्स की एक विशाल सूची है और मैं फ़ाइल में एक ही अनावश्यक सेट तत्व डेटा लिखना नहीं चाहता हूं। मैं एक फ़ाइल में अद्वितीय सेट तत्वों को लिखना चाहता हूं और फिर प्रत्येक तत्व के लिए एक अनुक्रमणिका, उन्हें एक विशेष सेट आइटम पर वापस जोड़ना चाहता हूं। – user974967

4

std::set has just a bidirectional iterator, जिसका अर्थ है कि आप ऐसा नहीं कर सकते जो आप operator + (या -) के साथ करने का प्रयास कर रहे हैं। वे केवल random access iterators पर उपलब्ध हैं, जैसे std::vector प्रदान करता है।

सेट की शुरुआत से अंत तक जाने के लिए आपको "अनुक्रमणिका" और std::advance प्राप्त करने के लिए std::distance का उपयोग करने की आवश्यकता है।

auto distance = std::distance(mySet.begin(), someIterator); 
auto it = mySet.begin(); 
std::advance(it, distance); 

assert(it == someIterator); 
+0

सेट के मामले में दूरी() फ़ंक्शन की समय जटिलता क्या है? क्या यह ओ (1) है? – Prince

+1

नहीं, चूंकि 'सेट' में केवल 'बिडरेक्शनल इटरेटर' है, 'दूरी' को सूची में चलना है। अगर इसमें 'यादृच्छिक अभिगम इटरेटर' था, तो यह ओ (1) हो सकता है। – moswald

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