遍历 C++ 映射时的奇怪行为
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[i]
时,您 创建了 地图中不存在的那些项目。
改用迭代器,
在打印循环之前,填充的 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()
时,它将失败并且循环结束。
我有以下程序可以找到数字的频率。
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[i]
时,您 创建了 地图中不存在的那些项目。
改用迭代器,
在打印循环之前,填充的 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()
时,它将失败并且循环结束。