C++ STL矢量迭代器不兼容

Jia*_*Guo 1 c++ stl vector

// 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

此部分用于擦除FDRFreq向量项,其中数据长度小于标准数,但调试断言失败:向量迭代器不兼容.我是C++ STL的绿色手,谢谢你的帮助.

pmr*_*pmr 8

你的问题是调用后的迭代器失效std::erase.警告由标准库实现中的迭代器调试扩展触发.erase在erase元素之后将迭代器返回到新的有效位置,并继续从那里迭代.但是,这仍然是非常低效的.

使用Erase-Remove Idiom从a中删除带有谓词的数据vector.

FDRFreq.erase(std::remove_if(
                begin(FDRFreq), end(FDRFreq), 
                [&StandardNum](const AlignedFDRData& x) { 
                  return fData.size() > StandardNum; }),
              end(FDRFreq));
Run Code Online (Sandbox Code Playgroud)


Mah*_*dsi 7

你的代码需要成为

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

"向量迭代器不兼容"意味着您正在使用的迭代器已失效 - 也就是说,无法保证它指向的元素仍然存在于该内存位置.擦除向量元素会使该位置之后的迭代器无效..erase返回一个可以使用的新的有效迭代器.

如果您是STL的新手,我强烈建议您阅读Scott Myer的有效STL(和有效的C++,当你在它的时候)