// 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的绿色手,谢谢你的帮助。
答案 0 :(得分: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));
答案 1 :(得分:7)
您的代码需要成为
while (iter != FDRFreq.end()){
if( iter->fData.size() < StandardNum){
iter = FDRFreq.erase(iter);
}
else{
++iter;
}
}
“向量迭代器不兼容”意味着您正在使用的迭代器已失效 - 也就是说,无法保证它指向的元素仍然存在于该内存位置。擦除向量元素会使该位置之后的迭代器无效。 .erase
返回一个可以使用的新的有效迭代器。
如果您是STL的新手,我强烈建议您阅读Scott Myer的有效STL (和有效的C ++ ,当您在此时)