2013-02-15 67 views
5

जोड़े के वेक्टर के इटरेटर में जोड़ी के मानों तक पहुंचने पर मुझे नीचे त्रुटि क्यों मिलती है?जोड़े के वेक्टर से मूल्य प्राप्त करने में त्रुटि

vector< pair<int,string> > mapper; 
if(Hash(input, chordSize) != id){ 
    mapper.push_back(make_pair(tmp, input)); 
} 

for (vector< pair<int,string> >::iterator it = mapper.begin(); it != mapper.end(); ++it) 
{ 
    cout << "1st: " << *it.first << " "   // <-- error! 
     << "2nd: " << *it.second << endl;  // <-- error! 
} 

त्रुटि संदेश:

main_v10.cpp:165:25: error: ‘std::vector > >::iterator’ has no member named ‘first’ main_v10.cpp:165:56: error: ‘std::vector > >::iterator’ has no member named ‘second’

मैं इसे कैसे ठीक कर सकते हैं?

+1

आप ऑपरेटर पूर्वता को पढ़ने के लिए, चेकआउट '*' और '.' पूर्वता चाहते हो सकता है: http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B – billz

उत्तर

7

यह एक मुद्दा है जो पॉइंटर्स के लिए भी लागू होता है (एक इटेटरेटर पॉइंटर की तरह बहुत अधिक व्यवहार करता है)। वहाँ एक सदस्य मूल्य का सूचक (या इटरेटर) अंक तक पहुँचने के लिए दो तरीके हैं:

it->first  // preferred syntax: access member of the pointed-to object 

या

(*it).first // verbose syntax: dereference the pointer, access member on it 

ऑपरेटर पूर्वता

*(it.first) // wrong! tries to access a member of the pointer (iterator) itself 

में अपने अभिव्यक्ति बदल जाता है जो सदस्य first को इटेटरेटर पर ही एक्सेस करने का प्रयास करता है, जो विफल रहता है, क्योंकि इसमें first नामक सदस्य नहीं है। यदि ऐसा होता है, तो आप उस सदस्य के मूल्य को कम कर देंगे।


हालांकि, ज्यादातर ऐसे मामलों में आप std::map का उपयोग मूल्यों की कुंजी से मैप करने के लिए करना चाहिए। vector<pair<int,string> > के बजाय, आप map<int,string> जो समान (प्रविष्टि, यात्रा और सामान भी जोड़े के साथ होता है) बर्ताव करता है का उपयोग करना चाहिए, लेकिन यह तेजी से यादृच्छिक अभिगम के लिए डेटा संरचना में चाबियाँ सॉर्ट करता:

map<int,string> mapper; 
if(Hash(input, chordSize) != id){ 
    mapper.push_back(make_pair(tmp, input)); 
} 

for (map<int,string>::iterator it = mapper.begin(); it != mapper.end(); ++it) 
{ 
    cout << "1st: " << it->first << " " 
     << "2nd: " << it->second << endl; 
} 

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

+0

मुझे लगता है कि 2 संस्करण' होना चाहिए (* यह)। पहला ' –

+0

@ जी-makulik बेशक, धन्यवाद। – leemes

+0

हां, दूसरा विकल्प सही है! धन्यवाद। तुम कमाल हो! –

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

  • कोई संबंधित समस्या नहीं^_^