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のグリーンハンドです、あなたの親切な助けに感謝します。

4

2 に答える 2

8

問題は、への呼び出し後のイテレータの無効化std::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));
于 2012-04-22T20:34:22.173 に答える
7

あなたのコードは

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

「ベクトルイテレータに互換性がない」とは、使用しているイテレータが無効になっていることを意味します。つまり、それが指す要素がそのメモリ位置にまだ存在するという保証はありません。ベクトル要素を消去すると、その位置に続くイテレータが無効になります。.erase代わりに使用できる新しい有効なイテレータを返します。

STLを初めて使用する場合は、ScottMyerのEffectiveSTL(およびEffective C ++を読んでいる間)を読むことを強くお勧めします。

于 2012-04-22T20:31:25.687 に答える