[英]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 Idiom從vector
刪除帶有謂詞的數據。
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.