我是SO的新手。我是C ++中迭代器(或者更确切地说是STL)的新手。我试图以循环方式迭代地图的键。所以,我们从一开始就开始阅读,一直到最后,然后再回到起点。下面的代码简化了我的程序的相关部分:
#include<iostream>
#include<map>
using namespace std;
int main(int argc, char* argv[])
{
map<const char*, int> colors;
colors = { { "RED", 1 },
{ "YELLOW", 2 },
{ "GREEN", 3 },
{ "ORANGE", 4 },
{ "CYAN", 5 } };
map<const char*, int>::iterator itr = colors.begin();
for(int i=0; i<10; i++) // Loop more than entries in map
{
cout<<itr->first<<endl;
if(itr==colors.end())
itr = colors.begin(); //start from beginning
else
itr++;
}
return 0;
}
我的程序(以及上面的程序)在遍历地图一次后不断崩溃。我无法弄清楚原因。我试着在SO和其他地方查找,但无法找到解决方案。
提前致谢。
答案 0 :(得分:1)
考虑迭代器为每个环路指向的内容。
当迭代器等于colors.end()
时,它不指向任何东西,并且你不允许取消引用它。
但你在之前取消引用迭代器(itr->first
),检查它是否等于colors.end()
。
答案 1 :(得分:0)
见评论:
for(int i=0; i<10; i++) {
std::cout << itr->first << std::endl;//Problematic..
if(itr == colors.end())
itr = colors.begin();
else
itr++; //If this increment results to an `end()` iterator
}
您无条件地访问迭代器而不检查它是否是end()
迭代器。在访问它指向的元素之前,您应该检查迭代器是否不是end()
迭代器。
您可以将循环更改为:
for(int i=0; i<10; i++){ // Loop more than entries in map
if( itr != colors.end() ){
std::cout<< itr->first << std::endl;
++itr;
}
else
itr = colors.begin(); //start from beginning
}