2011-01-24 11 views
1

サイズvectorを印刷しようとしています。簡単に聞こえますが、ベクトルはmapです。私はこのようなサイズを表示しようとしています
map<string, vector<map<vector<string> , vector<string> > > >::iterator it;イテレータを通したベクトルの印刷サイズ

: 現在、私はこのように見ているマップ上のイテレータを持って


EDIT:
イテレータはこのようにintialisedされています。 it = csvMap.find(commandList.at(lineCount));


cout<<"Size of vector in Map after modifying: " << it->second.size() <<"\n"<<endl;

これは機能しません。プログラムがクラッシュします。 一時ベクトルを作成し、値it->second; を入力する方法があると思いますが、サイズを取得するにはスペースを無駄にしないでください。

もっと良い方法がありますか?

ありがとうございます!


EDIT2:削除古いコード


EDIT 3:新しいコード:

  map<vector<string> , vector<string> > parameterMap; 
     parameterMap.insert(pair<vector<string> , vector<string> > (
      part1_input, part2_output)); 

     map<string, vector<map<vector<string> , vector<string> > > >::iterator it; 

     cout<<"\nSize of CSV Map before modifying: " << csvMap.size() <<endl; 
     //cout<<"Size of vector in CSV Map before modifying: " << it->second.size() <<"\n"<<endl; 


     if(csvMap.size() == 0) 
     { 
      /* 
      * csvMap is empty -> no need to search for something. Just insert the fist entries 
      */ 
      listedParameterMap.insert(listedParameterMap.end(), 1, parameterMap); 
      csvMap.insert(pair<string, vector<map<vector<string> , 
       vector<string> > > > (commandList[lineCount], 
       listedParameterMap)); 
      cout<<"CSV Map size: " << csvMap.size() <<endl; 
     } 
     else 
     { 
      /* 
      * Search if the Command is already available, if not, 
      * add it to the map with its corresponding list of maps (in/output values) 
      * find returns map::end if key is not found 
      */ 

      cout<<"Checking if: " << commandList.at(lineCount) << " is already in the list \n" << endl; 
      it = csvMap.find(commandList.at(lineCount)); 
      if (it == csvMap.end()) 
      { 
       /* 
       * it = csvMap.end() is true 
       * The command isn't found 
       */ 

       cout<< commandList.at(lineCount) << " command not available. Inserting it! \n" << endl; 
       listedParameterMap.insert(listedParameterMap.end(), 1, parameterMap); 
       csvMap.insert(pair<string, vector<map<vector<string> , 
       vector<string> > > > (commandList[lineCount], 
       listedParameterMap)); 
      } 
      else 
      { 
       /* 
       * it != csvMap.end() 
       * The command is found. Append the parameterMap to the vector in the map 
       */ 
       cout<< commandList.at(lineCount) << " is already in the list! Appending parameters on pos: "<< it->second.size()-1<< "\n" << endl; 
       it->second.push_back(parameterMap); 
      } 
     } 
     cout<<"\nSize of CSV Map after modifying: " << csvMap.size() <<endl; 
     cout<<"Size of vector in CSV Map after modifying: " << it->second.size() <<"\n"<<endl; 

私は誰かがまだこれを読んでいる願っています...

これで、最初の処理ではit.secondが問題になっているようです。しかし、私は理由を知りません。 (また、上記のコードで)
コードスニペット:

if(csvMap.size() == 0) 
     { 
      /* 
      * csvMap is empty -> no need to search for something. Just insert the fist entries 
      */ 
      listedParameterMap.insert(listedParameterMap.end(), 1, parameterMap); 
      csvMap.insert(pair<string, vector<map<vector<string> , 
       vector<string> > > > (commandList[lineCount], 
       listedParameterMap)); 
      cout<<"CSV Map size: " << csvMap.size() <<endl; 
      cout<<"listedParameterMap: " << listedParameterMap.size() <<endl; 
      cout<< commandList.at(lineCount) << " is already in the list! Appending parameters on pos: "<< it->second.size()<< "\n" << endl; 
     } 

これは動作しないようです。それにその洞窟がありますが。どんな考え? comanndListとlistedParameterMapは、表示されている範囲内です。

+1

繰り返しループを送信してください。文脈が必要です。 –

+0

'it-> second.size()'を使う前に、 'if(it!it = it!= csvMap.end())'をチェックしていますか? – Naveen

+0

検索している 'lineCount'が存在しますか?検索後に 'map :: end'と等しいかどうかチェックしますか? –

答えて

3
it = csvMap.find(commandList.at(lineCount)); 
if (it == csvMap.end()) { 
    cout << "not found\n"; 
} 
else { 
    cout << "Size of vector in Map after modifying: " << it->second.size() << '\n'; 
} 

間接参照することはできません最後のものは

いいえ、最後のイテレータはiteではありません容器内のm。

string c = (*it).first; 

イテレータは終了イテレータされた後、これがあるので、それを逆参照するとき、あなたは未定義の動作を持っています。

+0

@Fred CashCowsの回答pls – Beasly

+0

@Beasly:どうですか?私が言ったように、最後のイテレータはコンテナ内のアイテムではありません。 –

+0

@Fred Yea私はあなたを持っています。なぜ私はそれがこのようなものだと思ったかを伝えているだけです。だからmap :: endは空のフィールドですか? – Beasly

0

マップイテレータは、その特定の要素を消去しない限り、無効化されません。つまり、あなたは何か別のことをしたことになります。

1

itが無効な場所を指しています。マップのイテレータで初期化する必要があります。何かのようなものit = myMap.find("aaa"); //Replace it with actual keyfindを実行した後、有効なイテレータを確認する必要があります。もう一度myMap.end()をチェックしてください。また

cout<<"Size of vector in CSV Map before modifying: " << it->second.size() <<"\n"<<endl; 

、あなたがcsvMap.end()を指すイテレータを逆参照、それが再びクラッシュにつながることができません:あなたはここに初期化されていないイテレータを使用している

EDIT。 EDIT 3

あたりとして

あなたはまだif(csvMap.size() == 0)if(it == csvMap.end())場合に終了することを指し初期化されないイテレータ/イテレータを使用しています。 itを戻り値insertで初期化する必要があります。この場合、 it = csvMap.insert(....).first;のようになります。

+0

私はこれをやったことはもちろん申し訳ありません...コードを追加します – Beasly

+0

あなたは初期化コードを投稿してください。 – Naveen

+1

あなたのEDIT2によると、上記の説明はまだ有効です。初期化されていないイテレータを使用しています。また、iteatorを使用している間、投稿されたコードにはさらに多くの問題があります。 – Naveen

0

あなたのコレクションはかなり複雑です。

要素があることを知っておく必要がありますが、サイズを確認するには、findは地図の「終わり」を返しませんでした。そうであれば、返されたイテレータは使用できません。

もちろん、これをどう扱うかはあなた自身の判断です。たとえば、文字列が見つからない場合は0を返します(0が見つかりましたが内容はありません)。

今、あなたは、私はすぐにバグを発見してコードを編集した:

if (it == csvMap.end()) 
      { 

      /* 
      * it = csvMap.end() > true 
      * Either when command isn't found or command is the last 
      */ 

      string c = (*it).first; 

あなたは(itがある)最後

いずれかのコマンドが見つからない場合、またはコマンド
+0

私はAPIから:特定のキー値が見つかった場合は要素へのイテレータ、指定されたキーがコンテナ内に見つからない場合はmap :: endを取得していました。 " その理由は、最後のものを指していません... – Beasly

+0

見つからないときはmap :: endを指しますが、それは最後の要素ではなく、最後の要素を超えたものです。 – CashCow

関連する問題