Rumah >php教程 >PHP开发 >vector的erase操作

vector的erase操作

高洛峰
高洛峰asal
2016-11-22 15:24:081720semak imbas

    最近,在看书的时候,偶然间发现一个细节:就是vector的erase操作。对于这个erase操作,大家都清楚,这个删除操作有2种形式,(1)删除单个元素,参数是迭代器变量;(2)删除区间元素,参数是begin和end。而细节就是在删除单个元素的时候,发生的具体事情。

    例如:有一个vector,是这样初始化的,vectorbd43222e33876353aff11e13a7dc75f6 va{0,1,2,2,3,4,5},删除掉vector中 元素等于2的!

通常代码是这样写的:

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

乍一看并无不妥之处,然而结果却出乎意料

QQ图片20161122092324.png

为什么结果会是这样呢?仔细想想了,原来是在删除的地方出了错误,当if条件成立之后,vector进行删除操作,删除掉vector中符合条件的元素,重点来了,当vecotr执行erase操作的之后,返回的值表示当前被删除迭代器的下一位置,注意,是下一个位置,然后,当再次循环的是,迭代器又向后移动了一个位置,导致接下来相同的元素并没有被删除。

附上正确写法:

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


Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn