Recently, while reading a book, I accidentally discovered a detail: the erase operation of vector. For this erase operation, everyone knows that this delete operation has two forms, (1) delete a single element, the parameter is an iterator variable; (2) delete an interval element, the parameters are begin and end. The details are the specific things that happen when a single element is deleted.
For example: There is a vector, initialized like this, vector
Usually the code is written like this:
#include <vector> #include <iostream> int main() { std::vector<int> va{ 1,2,3,4,4,5,6 }; std::vector<int> vb(va); for (auto i = va.begin();i != va.end(); i++) { if (*i == 4) { i = va.erase(i); } } for (auto i : va) { std::cout << i << " "; } return 0; }
There is nothing wrong at first glance, but the result is unexpected
Why is the result like this? After thinking about it carefully, it turns out that there was an error in the deletion. When the if condition is established, the vector performs a deletion operation and deletes the elements in the vector that meet the conditions. The key point is that when vecotr performs the erase operation, the returned value Represents the next position of the currently deleted iterator. Note that it is the next position. Then, when the loop is repeated again, the iterator moves back one position, causing the same element to be deleted.
Attached is the correct spelling:
#include <vector> #include <iostream> int main() { std::vector<int> va{ 1,2,3,4,4,5,6 }; std::vector<int> vb(va); auto iter = vb.begin(); while(iter!=vb.end()) { if (iter != vb.end()) { if (*iter == 4) { iter = vb.erase(iter); } else { iter++; } } } for (auto j : vb) { std::cout << j << " "; } return 0; }
#include <vector> #include <iostream> int main() { std::vector<int> va{ 1,2,3,4,4,5,6 }; for (auto i = va.begin();i != va.end(); ) { if (*i == 4) { i = va.erase(i); } else { i++; } } for (auto i : va) { std::cout << i << " "; } return 0; }