Home  >  Article  >  php教程  >  Erase operation of vector

Erase operation of vector

高洛峰
高洛峰Original
2016-11-22 15:24:081682browse

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 va{0,1,2,2,3,4,5}, delete the elements in the vector that are equal to 2!

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

Erase operation of vector

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; }


Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn