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 Idiomvector.

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 新手,我强烈建议您阅读 Scott Myer 的Effective STL(和Effective C++,当您在使用它时)

于 2012-04-22T20:31:25.687 回答