循环迭代C ++映射,程序崩溃

时间:2017-03-04 22:40:18

标签: c++

我是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和其他地方查找,但无法找到解决方案。

提前致谢。

2 个答案:

答案 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
}

Demo