C++ STL vector iterators incompatible

后端 未结 2 1225
予麋鹿
予麋鹿 2020-12-21 22:41
// Erase the missing items
vector::size_type StandardNum = FDRFreq.at(0).fData.size();
vector::iterator iter = FDRFreq.be         


        
相关标签:
2条回答
  • 2020-12-21 22:59

    Your problem is iterator invalidation after the call to std::erase. The warning is triggered by an iterator debugging extensions in your standard library implementation. erase returns an iterator to the new valid location after the erase element and you continue iterating from there. However, this is still very inefficient.

    Use the Erase-Remove Idiom to remove data with a predicate from a vector.

    FDRFreq.erase(std::remove_if(
                    begin(FDRFreq), end(FDRFreq), 
                    [&StandardNum](const AlignedFDRData& x) { 
                      return fData.size() > StandardNum; }),
                  end(FDRFreq));
    
    0 讨论(0)
  • 2020-12-21 23:02

    Your code needs to become

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

    "vector iterators incompatible" means that the iterator you're using has been invalidated - that is to say, there is no guarantee that the elements it points to still exist at that memory location. An erase of a vector element invalidates the iterators following that location. .erase returns a new, valid iterator you can use instead.

    If you're new to STL, I highly recommend you read Scott Myer's Effective STL (and Effective C++, while you're at it)

    0 讨论(0)
提交回复
热议问题