C ++ STL矢量迭代器不相容(C++ STL vector iterators incompat

2019-06-23 20:31发布

// 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,谢谢你的好心帮。

Answer 1:

你的代码需要成为

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

“矢量迭代器不兼容”意味着你正在使用的迭代器已经失效 - 也就是说,不能保证它指向的元素在那个内存位置仍然存在。 一个向量的元素的擦除无效以下该位置的迭代器。 .erase返回一个新的,有效的迭代,您可以改用。

如果你是新来的STL,我强烈建议你读斯科特·迈尔的Effective STL(C ++有效 ,而你在它)



Answer 2:

你的问题是迭代器失效后调用std::erase 。 该警告是通过迭代器在调试你的标准库实现扩展触发。 erase返回一个迭代器擦除元素之后的新的有效的位置,你从那里继续迭代。 然而,这仍然是非常低效的。

使用擦除删除成语与从谓词删除数据vector

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


文章来源: C++ STL vector iterators incompatible
标签: c++ stl vector