vector的erase操作
最近,在看书的时候,偶然间发现一个细节:就是vector的erase操作。对于这个erase操作,大家都清楚,这个删除操作有2种形式,(1)删除单个元素,参数是迭代器变量;(2)删除区间元素,参数是begin和end。而细节就是在删除单个元素的时候,发生的具体事情。
例如:有一个vector,是这样初始化的,vector
通常代码是这样写的:
#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; }
乍一看并无不妥之处,然而结果却出乎意料
为什么结果会是这样呢?仔细想想了,原来是在删除的地方出了错误,当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; }

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)
