简体   繁体   中英

Valid or Invalid Iterators And Iterator Positions

I have a simple example routine below for erasing vector elements, the positions of which are stored in another vector. I've been using this method for some time now and only recently have experienced an error: Expression: vector iterator + offset out of range.

I seem to have found the problem, that being within the parameters of the erase() call I wasn't enclosing the 2nd part in parenthesis, which occasionally resulted in the above error when erasing elements near the end of the vector.

Now I've identified and corrected the problem, I would be grateful if somebody could just confirm that my simple routine below is in fact valid and without error, and that to call erase() within a for-loop in this way is okay.

I realise this routine only works if erasing element positions in order of first to last. Please see my code below:

vector<int> mynumbers;
mynumbers.push_back(4);
mynumbers.push_back(5);
mynumbers.push_back(6);
mynumbers.push_back(7); 

vector<int> delpositions;
delpositions.push_back(1);
delpositions.push_back(2);
delpositions.push_back(3);  

for(unsigned int i = 0; i < delpositions.size(); ++i)   
    mynumbers.erase(mynumbers.begin() + (delpositions[i] - i));

// Used To Be: delpositions[i] - i Which Caused The Error! Instead of: (delpositions[i] - i)

You do the right thing by adjusting the 'delposition' by the number of elements erased. Just ensure 'delpositions' are sorted ascending.

Erasing in reverse order (last to first) might be a bit more efficient.

I consider

vector result; 
result.reserve(mynumbers.size() - delpositions.size()); 
// copy valid positions to result 
mynumbers.swap(result)

a better solution

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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