簡體   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