2012-09-19 14 views
7

मुझे यह कोड मिला है और मैं उस भाग को समझ नहीं पा रहा हूं जहां बराबर_रेंज विधि इटरेटर लौटाता है। इस बिल्कुल क्या मतलब है - मैं जानता हूँ कि सीमा जोड़ी के अंदर दो मल्टीमैप वस्तुओं के साथ वस्तु है, लेकिन मैं नहीं मिलता है क्या, क्यों है 'for (it = range.first; it != range.second; ++it)' है?सी ++: एसटीएल multimap.equal_range()

// multmap.cpp -- use a multimap 
#include <iostream> 
#include <string> 
#include <map> 
#include <algorithm> 

typedef int KeyType; 
typedef std::pair<const KeyType, std::string> Pair; 
typedef std::multimap<KeyType, std::string> MapCode; 

int main() 
{ 
using namespace std; 
MapCode codes; 
codes.insert(Pair(415, "San Francisco")); 
codes.insert(Pair(510, "Oakland")); 
codes.insert(Pair(718, "Brooklyn")); 
codes.insert(Pair(718, "Staten Island")); 
    codes.insert(Pair(415, "San Rafael")); 
    codes.insert(Pair(510, "Berkeley")); 

    cout << "Number of cities with area code 415: " 
    << codes.count(415) << endl; 
    cout << "Number of cities with area code 718: " 
    << codes.count(718) << endl; 
    cout << "Number of cities with area code 510: " 
    << codes.count(510) << endl; 
    cout << "Area Code City\n"; 

    MapCode::iterator it; 
    for (it = codes.begin(); it != codes.end(); ++it) 
    cout << " " << (*it).first << " " 
    << (*it).second << endl; 

    pair<MapCode::iterator, MapCode::iterator> range 
     = codes.equal_range(718); 

    cout << "Cities with area code 718:\n"; 
    for (it = range.first; it != range.second; ++it) //<------------------ here 
    cout << (*it).second << endl; 
    return 0; 
} 

उत्तर

11

जोड़ी में iterators आप ढंग [range.first, range.second) में की गई खोज के बराबर कुंजी के साथ आइटम की सीमा निर्धारित करते हैं।

इसका मतलब है कि उस सीमा को फिर से शुरू करने के लिए, आप range.first से शुरू करते हैं और इसे तब तक अग्रेषित करते हैं जब तक यह range.second तक पहुंच न जाए, जिसका अर्थ है कि आपने बराबर सीमा को बंद कर दिया है। संकल्पनात्मक रूप से यह वही होता है जब आप [container.begin(), container.end()) श्रेणी में फिर से होते हैं।

+0

मुझे लगता है कि आपका जवाब, मेरे लिए सबसे समझा जा सकता है क्योंकि यह बार-बार दोहराना से अधिक देखने के लिए जोड़ी वस्तुओं सदस्यों भ्रामक था। लेकिन अगर यह * [कंटेनर.बीजिन(), कंटेनर.एंड()) के समान * है, तो यह ठीक है। धन्यवाद – ashur

4

equal_range इटरेटर i1, i2 की एक जोड़ी देता है जैसे [i1, i2) श्रेणी के सभी तत्व एक ही कुंजी हैं। इसलिए, कोड 718 के साथ सभी शहरों के माध्यम से पुन: प्रयास करने के लिए, आप equal_range पर कॉल करते हैं, और फिर लौटा जोड़ी के first लौटा जोड़ी के second पर फिर से चालू करें।

+0

लघु और मीठा – ammassalik

24

equal_range, अर्थात् अपने range वस्तु का परिणाम है, दो iterators [beginning-of-range, end-of-range) के जोड़ी है। तो तुम [range.first, range.second) से अधिक पुनरावृति करना चाहते हैं:

auto range = m.equal_range(4); 

+---+---+---+---+---+---+---+---+---+ 
| 2 | 3 | 3 | 4 | 4 | 4 | 4 | 5 | 6 | =: m 
+---+---+---+---+---+---+---+---+---+ 
      ^   ^
      |    | 
     range.first range.second 
संबंधित मुद्दे