2017-03-04 12 views
0

私は新しいです。私はC++のイテレータ(またはむしろSTL)を初めて使用しています。私はマップのキーを循環的に反復しようとしています。だから、始めから読んでから最後に進み、もう一度最初に戻ります。C++マップを循環的に反復処理すると、プログラムがクラッシュする

#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などを調べてみると解決策を見つけることができませんでした。

ありがとうございます。

答えて

1

ループの周りを1つ1つ繰り返している点について、イテレータが指しているものについて考えてみましょう。

イテレータがcolors.end()に等しくなると、それは何も指しておらず、逆参照も許されません。

ただし、反復子(itr->firstの前には、の前に、colors.end()と等しいかどうかをチェックします。

+0

おかげで、私は最後()ではなく、コンテナ内の最後の実体よりも、何を指していることを忘れていました。私は恥ずかしいです。 – user7659698

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

関連する問題