// 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,谢谢你的好心帮。
你的代码需要成为
while (iter != FDRFreq.end()){
if( iter->fData.size() < StandardNum){
iter = FDRFreq.erase(iter);
}
else{
++iter;
}
}
“矢量迭代器不兼容”意味着你正在使用的迭代器已经失效 - 也就是说,不能保证它指向的元素在那个内存位置仍然存在。 一个向量的元素的擦除无效以下该位置的迭代器。 .erase
返回一个新的,有效的迭代,您可以改用。
如果你是新来的STL,我强烈建议你读斯科特·迈尔的Effective STL(和C ++有效 ,而你在它)
你的问题是迭代器失效后调用std::erase
。 该警告是通过迭代器在调试你的标准库实现扩展触发。 erase
返回一个迭代器擦除元素之后的新的有效的位置,你从那里继续迭代。 然而,这仍然是非常低效的。
使用擦除删除成语与从谓词删除数据vector
。
FDRFreq.erase(std::remove_if(
begin(FDRFreq), end(FDRFreq),
[&StandardNum](const AlignedFDRData& x) {
return fData.size() > StandardNum; }),
end(FDRFreq));