2012-09-19 30 views
7

我有這段代碼,我無法理解部分equal_range方法返回迭代器。 我知道的範圍是與內部的兩個多重映射對象的對象,但我不明白,這就是爲什麼有'for (it = range.first; it != range.second; ++it)' - 這是什麼意思是什麼呢?C++:STL 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

對中的迭代器定義的項目等於搜尋內容的方式[range.first, range.second)鍵範圍。

這意味着,在該範圍迭代,你range.first啓動和推進迭代,直到它到達range.second,這意味着你剛剛走下同等範圍。從概念上說,它與迭代範圍[container.begin(), container.end())時發生的情況相同。

+0

我認爲你的回答是最理解我,因爲它混淆了,看在迭代對象對成員。但是,如果它與* [container.begin(),container.end())'相同*沒關係。謝謝 – ashur

4

equal_range返回一對迭代器i1, i2,使得範圍[i1, i2)內的所有元素具有相同的密鑰。因此,爲了遍歷代碼爲718的所有城市,請致電equal_range,然後從返回的對first到返回的對second進行迭代。

+0

簡短而甜美 – ammassalik

24

equal_range的結果,即您的range對象,是兩個迭代器[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