簡體   English   中英

迭代c ++ map時出現奇怪的行為

[英]strange behaviour while iterating through c++ map

我有以下程序,可以找到數字的頻率。

map<int,int> mp;
vector<int> x(4);
x[0] = x[2] = x[3] = 6;
x[1] = 8;

for(int i=0;i<x.size();++i)
    mp[x[i]]++;

cout<<"size:"<<mp.size()<<endl; //Prints 2 as expected

for(int i=0;i<mp.size();++i) //iterates from 0->8 inclusive
    cout<<i<<":"<<mp[i]<<endl;

輸出如下:

size:2
0:0
1:0
2:0
3:0
4:0
5:0
6:3
7:0
8:1

為什么迭代次數超過9次? 在插入元素時我也嘗試使用insert而不是[]運算符,但結果是一樣的。 我還使用迭代器迭代地圖進行測試。

在打印循環之前,填充的mp元素是[6][8] 當你調用cout ... << mp[i]i 0打印時,它會插入一個新元素[0] ,默認值為0 ,返回對該元素的引用然后被打印,然后你的循環測試i < mp.size()實際上與新的3大小進行比較。 其他迭代添加了更多元素。

你應該這樣做:

for (std::map<int,int>::const_iterator i = std::begin(mp);
     i != std::end(mp); ++i)
    std::cout << i->first << ':' << i->second << '\n';

...或者,對於C ++ 11 ......

for (auto& e : mp)
    std::cout << e.first << ':' << e.second << '\n';

當您訪問mp[i] ,如果該元素尚不存在,則該元素將添加到地圖中。 所以循環的第一次迭代將嘗試讀取mp[0] 這將創建元素,所以現在mp.size() == 3 只要迭代嘗試訪問不存在的元素,大小就會繼續增加。

當你到達i == 8 ,元素存在,所以它不會增加大小。 當它返回到循環的頂部並測試9 < mp.size() ,它將失敗並且循環結束。

因為當您在打印循環中使用mp[i] ,您將創建地圖中不存在的項目。

改為使用迭代器,

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM