पुनरावृति का क्या अर्थ है-> दूसरा मतलब?


157

C ++ में, a का प्रकार क्या है std::map<>::iterator?

हम जानते हैं कि एक itप्रकार std::map<A,B>::iteratorकी वस्तु में एक अतिभारित होता है operator ->जो एक रिटर्न देता है std::pair<A,B>*, और std::pair<>एक ए firstऔर secondसदस्य होता है।

लेकिन, इन दो सदस्यों से क्या मेल खाता है, और हमें नक्शे में संग्रहीत मूल्य तक क्यों पहुंचना है it->second?


14
एक कुंजी और एक मूल्यstd::map संग्रहीत करता है । मान को संदर्भित करता है । map::iterator.second
आलोक सेव

जवाबों:


247

मुझे यकीन है कि आप जानते हैं कि वस्तुओं std::vector<X>का एक पूरा गुच्छा स्टोर करता है X, है ना? लेकिन अगर आपके पास एक है std::map<X, Y>, जो वास्तव में संग्रहीत करता है वह एस का एक पूरा गुच्छा है std::pair<const X, Y>। यह वास्तव में एक नक्शा है - यह कुंजी और संबंधित मूल्यों को एक साथ जोड़ देता है।

जब आप एक से अधिक पुनरावृति std::mapकरते हैं, तो आप इन सभी में से अधिक पुनरावृत्ति कर रहे हैं std::pair। जब आप इन पुनरावृत्तियों में से किसी एक का विरोध करते हैं, तो आपको एक std::pairकुंजी और उससे संबंधित मान मिलता है।

std::map<std::string, int> m = /* fill it */;
auto it = m.begin();

यहां, यदि आप अब करते हैं, तो आपको मानचित्र में पहले तत्व *itके std::pairलिए मिलेगा ।

अब प्रकार std::pairआपको दो सदस्यों के माध्यम से इसके तत्वों तक पहुंच प्रदान करता है: firstऔर second। इसलिए यदि आपके पास एक std::pair<X, Y>कॉल है p, p.firstएक Xऑब्जेक्ट है और p.secondएक Yऑब्जेक्ट है।

तो अब आप जानते हैं कि एक std::mapपुनरावृत्ति करने वाला आपको एक देता है std::pair, तो आप इसके तत्वों का उपयोग कर सकते हैं firstऔर second। उदाहरण के लिए, (*it).firstआपको कुंजी (*it).secondदेगा और आपको मूल्य देगा। इन के बराबर हैं it->firstऔर it->second


4
वे प्रोग्रामिंग में बाकी सब चीजों की तरह [0] और [1] ("पहले" और "दूसरे") का उपयोग क्यों नहीं करते?

21
@AdamCross क्योंकि operator[]एक विशिष्ट प्रकार के वापस जाने के लिए है, लेकिन firstऔर secondविभिन्न प्रकार के हो सकते हैं। दूसरी ओर, सूचकांक द्वारा अपने तत्वों तक पहुंचने के लिए std::tupleएक विशेष सहायक कार्य है std::get
जोसफ मैन्सफील्ड

16

ए के तत्वों के प्रकार std::map(जो कि उस मानचित्र के एक पुनरावृत्ति को dereferencing द्वारा प्राप्त अभिव्यक्ति का प्रकार भी है) जिसकी कुंजी है Kऔर मान Vहै std::pair<const K, V>- कुंजी यह constहै कि आपको मानचित्र मानों की आंतरिक छँटाई के साथ हस्तक्षेप करने से रोकना है।

std::pair<>नाम के दो सदस्य हैं firstऔर second( यहाँ देखें ), काफी सहज अर्थ के साथ। इस प्रकार, iएक निश्चित नक्शे के लिए एक पुनरावृत्ति दिया , अभिव्यक्ति:

i->first

जो इसके बराबर है:

(*i).first

पुनरावृत्ति द्वारा इंगित ऑब्जेक्ट के पहले ( const) तत्व को pairसंदर्भित करता है - अर्थात यह नक्शे में एक कुंजी को संदर्भित करता है । इसके बजाय, अभिव्यक्ति:

i->second

जो इसके बराबर है:

(*i).second

के दूसरे तत्व को संदर्भित करता है pair- अर्थात मानचित्र में संबंधित मान


5
"कुंजी" और "मूल्य" शब्द "पहले" और "दूसरे" की तुलना में अधिक सहज ज्ञान युक्त होता, जो कि आदेश देने का अर्थ है।
एहोफर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.