2014-06-26 43 views
0

這個例子中使用的equal_range是提供在cplusplus.com網站:multmap equal_range在C++

int main() 
{ 
    std::multimap<char,int> mymm; 

    mymm.insert(std::pair<char,int>('a',10)); 
    mymm.insert(std::pair<char,int>('b',20)); 
    mymm.insert(std::pair<char,int>('b',30)); 
    mymm.insert(std::pair<char,int>('b',40)); 
    mymm.insert(std::pair<char,int>('c',50)); 
    mymm.insert(std::pair<char,int>('c',60)); 
    mymm.insert(std::pair<char,int>('d',60)); 

    std::cout << "mymm contains:\n"; 
    for (char ch='a'; ch<='d'; ch++) 
    { 
     std::pair <std::multimap<char,int>::iterator, std::multimap<char,int>::iterator> ret; 
     ret = mymm.equal_range(ch); 
     std::cout << ch << " =>"; 
     for (std::multimap<char,int>::iterator it=ret.first; it!=ret.second; ++it) 
     std::cout << ' ' << it->second; 
     std::cout << '\n'; 
    } 

和輸出被說成是:

mymm contains: 
a => 10 
b => 20 30 40 
c => 50 60 
d => 60 

但不是這個錯誤?例如,對於'd',條件it!=ret.second將立即失敗,循環將永遠不會執行?或者我弄錯了嗎? (這一點很重要,因爲我在這個例子中已經有了一些代碼,並且第二次看起來認爲它可能會行事不端。)

+0

迭代器間隔半開。 – chris

回答

4

範圍中的第二個迭代器是它的「一個過去的末尾」像mymm.end()的工作方式。如果mymm.begin()mymm.end()相同,則容器中不存在任何內容。這裏,ret.firstret.second是相同的,意味着在結果範圍內沒有元素。由於「d」有一個元素,因此ret.first指向該元素,ret.secondmymm.end()相同。

+0

歡呼聲。可悲的是,排除了我的代碼行爲不端的原因之一:( – adrianmcmenamin