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


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.