1

プログラムがこのプライベートメソッドを実行すると

map<char*, vector<MAILPACK>>::iterator mit;
vector<MAILPACK>::iterator dit;
for(mit=funcs.begin(); mit!=funcs.end(); mit++) {
    TRACE tr;
    tr.crc32 = crc32;
    strncpy(tr.name, (*mit).first, sizeof(tr.name));
    int i = 0;
    for(dit=(*mit).second.begin(); dit!=(*mit).second.end(); dit++){
        tr.nodes[i++] = dit->dwAddr;
    }       
}   

次のようなエラーが発生します。Expression:map/set iterator not incrementable

この関数は、プライベート マップを反復処理しますstd::map<char*, std::vector<MAILPACK>> funcs;

どこが間違っていますか?どうも

PSああ、アドレスをtr.nodesに保存するときに境界を制御していないことがわかりました。しかし、これはポイントではありません...

4

1 に答える 1

1

typedef迷わない人もいます。また、反復子を事前にインクリメントして、無駄な反復子オブジェクトのコピーを回避します。

typedef vector<MAILPACK> Mailpacks;
typedef map<char*, Mailpacks> MailpackMap;

for(MailpackMap::iterator mit=funcs.begin(); mit!=funcs.end(); ++mit) 
{
  TRACE tr;
  tr.crc32 = crc32;
  strncpy(tr.name, (*mit).first, sizeof(tr.name));
  int i = 0;
  Mailpacks& mail = (*mit).second;
  for(Mailpacks::iterator dit= mail.begin(); dit!=mail.end(); ++dit)
  {
    tr.nodes[i++] = dit->dwAddr;
  }       
}

私は@Chowlettに同意します。あなたは自分のtr.nodes限界を超えてイテレータの1つを踏み越えていると思います。TRACEループ中にオブジェクトをインスタンス化しているため、これが発生している可能性が高くなります。通常、イテレータが無効化Expression:map/set iterator not incrementableされたときにエラーが発生します。

あなたがtr.nodesメンバーでもベクターになれない理由はありますか?

tr.nodes.push_back(dit->dwAddr);

私は間違っているかもしれませんが、より多くの情報が常に役に立ちます。

于 2012-08-07T13:07:34.817 に答える