[英]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.