Maison > php教程 > PHP开发 > le corps du texte

vector的erase操作

高洛峰
Libérer: 2016-11-22 15:24:08
original
1687 Les gens l'ont consulté

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

    例如:有一个vector,是这样初始化的,vector 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; }
Copier après la connexion

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

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; }
Copier après la connexion
#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; }
Copier après la connexion


Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Recommandations populaires
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal