2014-09-16 12 views
5

में एक पुनरावर्तक की अनुक्रमणिका प्रिंट करना std::map की विधि का उपयोग कर रहा है, जो इटरेटर देता है।
हालांकि मुझे पाए गए तत्व के इंडेक्स की आवश्यकता है; उदाहरण के लिए: 0, जो std::map::begin() से मेल खाता है, और इसी तरह।std :: map

#include <map> 
#include <utility> 
#include <iostream> 

int main() 
{ 
    std::map< int, int > aMap; 
    aMap.insert(std::make_pair(100, 50)); 
    aMap.insert(std::make_pair(200, 40)); 
    aMap.insert(std::make_pair(300, 60)); 

    std::map< int, int >::iterator it_map = aMap.find(300); 
    if (it_map != aMap.end()) 
    std::cout << it_map << "\n"; // error 

} 

यह संकलित नहीं करता है और मुझे कारण पता है। हालांकि, मुझे 2 प्रिंट करने का एक तरीका चाहिए क्योंकि 300 की अनुक्रमणिका 2.

उस साधारण उदाहरण के लिए, आप कह सकते हैं कि नक्शा (बाइनरी पेड़) एक अच्छा कंटेनर नहीं है। हालांकि, असली कोड में, मेरे पास खोज करने के लिए बहुत सारे तत्व हैं और बाइनरी पेड़ इसके लिए अच्छा है।

कोई विचार?

+2

आप एक द्विआधारी वृक्ष संरचना के सूचकांक को कैसे परिभाषित ? – 101010

+0

@ 40two: एक मानचित्र जरूरी नहीं है कि एक पेड़ के रूप में लागू किया गया हो, और इसमें पेड़ की तरह इंटरफ़ेस न हो; लेकिन यह आदेश दिया गया है, इसलिए आप उस आदेश के अनुसार एक सूचकांक को परिभाषित कर सकते हैं जैसा सवाल बताता है। –

+0

@ माइकसेमोर मानक के अनुसार यह आवश्यक रूप से एक पेड़ के रूप में लागू नहीं किया गया है, सहमत है। हालांकि, हर कार्यान्वयन में मुझे पता है कि एक पेड़ के रूप में लागू किया गया है। इसके अलावा, जब एक सम्मिलन या निष्कर्षण होता है, तो कोई भी पिछला आदेश परेशान होता है। नतीजतन, जैसा कि आपका उत्तर सही ढंग से बताता है कि आप एक इंडेक्स को परिभाषित कर सकते हैं लेकिन केवल 'std :: map' के currend स्थिति के लिए। – 101010

उत्तर

7

यदि आपको सूचकांक की आवश्यकता है, तो शायद एक नक्शा गलत डेटा प्रकार है; इंडेक्स को खोजने के लिए आपको लॉगरिदमिक-टाइम सर्च के लाभ को खोने के लिए मानचित्र (रैखिक समय में) के माध्यम से फिर से प्रयास करना होगा।

शायद एक क्रमबद्ध वेक्टर, lower_bound एल्गोरिदम का उपयोग लॉगरिदमिक समय में तत्व खोजने के लिए, अधिक उपयुक्त हो सकता है। फिर आप परिणामी यादृच्छिक-पहुंच इटरेटर को begin() इटरेटर से निरंतर समय में घटा सकते हैं।

फिर भी, आप एक नक्शा उपयोग करना चाहते हैं, तो: इस तरह

std::cout << std::distance(aMap.begin(), it_map) << '\n'; 
5

उपयोग std::distance,:

std::cout << std::distance(std::begin(aMap),it_map) << endl; 

प्रलेखन here

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