迭代c ++ map时出现奇怪的行为

时间:2015-01-27 06:05:20

标签: c++ loops dictionary size

我有以下程序可以找到数字的频率。

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而不是[]运算符,但结果是相同的。我还使用迭代器迭代地图进行测试。

3 个答案:

答案 0 :(得分:7)

在您的打印循环之前,已填充的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';

答案 1 :(得分:1)

当您访问mp[i]时,如果该元素尚不存在,则该元素将添加到地图中。因此,循环的第一次迭代将尝试读取mp[0]。这将创建元素,所以现在mp.size() == 3。只要迭代尝试访问不存在的元素,大小就会继续增加。

当你到达i == 8时,该元素存在,因此它不会增加大小。当它回到循环的顶部并测试9 < mp.size()时,它将失败并且循环结束。

答案 2 :(得分:0)

因为当您在打印循环中使用mp[i]时,您创建地图中不存在的项目。

改为使用迭代器,