2012-04-22 13 views
1
// Erase the missing items 
vector<AlignedFDRData>::size_type StandardNum = FDRFreq.at(0).fData.size(); 
vector<AlignedFDRData>::iterator iter = FDRFreq.begin(); 
while (iter != FDRFreq.end()){ 
    if(iter->fData.size() < StandardNum){ 
     FDRFreq.erase(iter); 
    } 
    else{ 
     ++iter; 
    } 
} 

この部分はデータ長が標準数よりも小さいが、デバッグアサーションが失敗した、FDRFreqベクトル項目を消去するために使用される:ベクターは、互換性のないイテレータ。私はC++ STLの緑色の手です。親切に助けてくれてありがとう。C++ STLベクトルイテレータは、互換性のない

+0

イテレータを消去すると、そのイテレータが無効になります。 Mahmoudが応答したように、消去の呼び出しから返されたイテレータを格納する必要があります – EdChum

答えて

6

あなたのコードは、「互換性のないベクトルイテレータ」

while (iter != FDRFreq.end()){ 
    if(iter->fData.size() < StandardNum){ 
     iter = FDRFreq.erase(iter); 
    } 
    else{ 
     ++iter; 
    } 
} 

になる必要が使用しているイテレータが無効になっていることを意味します - それは言うことです、それが指す要素がまだ存在するという保証はありませんその記憶場所にある。ベクトル要素を消去すると、その位置に続くイテレータが無効になります。 .eraseは、代わりに使用できる新しい有効なイテレータを返します。

あなたはSTLに新しいしている場合、私は非常に(あなたがそれをしている間、および効果的なC++)あなたはスコット・マイヤーズ効果的なSTLを読むことをお勧めします

+1

これは理由による慣用的な方法ではありません。要素が削除されると、再配置とコピーがトリガーされます。それを使用しないでください。 – pmr

+0

はい、それはOPが尋ねた質問に対する正解です。私は、正しい方法を提供する効果的なSTLを読むという勧告を加えました。 –

+1

ポイントを獲得しました。それでも、私はここで一冊の本への言及は役に立たないとは思わない。 OPは彼がすぐに必要とする情報を見つけるつもりはなく、彼のコードは引き続き間違っています(はい、私は間違ったコードを間違ったコードとみなします)。 – pmr

8

あなたの問題は、呼び出し後イテレータの無効ですstd::erase。この警告は、標準ライブラリ実装の拡張機能をデバッグするイテレータによってトリガされます。 eraseは、erase要素の後に新しい有効な場所にイテレータを返し、そこから反復を続けます。しかしながら、これは依然として非常に非効率的である。

Erase-Remove Idiomを使用して、述語を持つデータをvectorから削除します。

FDRFreq.erase(std::remove_if(
       begin(FDRFreq), end(FDRFreq), 
       [&StandardNum](const AlignedFDRData& x) { 
        return fData.size() > StandardNum; }), 
       end(FDRFreq)); 
+0

あなたの改訂版の解答、リンク、および正しいコードは、鉱山よりも正確になりました。 –

関連する問題