繁体   English   中英

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

[英]C++ STL vector iterators incompatible

// 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的专家,感谢您的帮助。

您的问题是在调用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));

您的代码需要成为

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

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

如果您是STL的新手,我强烈建议您阅读Scott Myer的Effective STL (和Effective C ++ )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM