在vector中有三种涉及删除的方法,第一种是vector::clear(),第二种是vector::erase(),第三种是vector::pop_back()。clear用来清空整个vector,同时将size变成0,无返回值;erase通过传入迭代器进行删除,既可以删除单个元素,也可以删除某一范围的元素,删除之后它将返回下一个位置的迭代器;pop_back用来删除末尾元素,同时将size减1,无返回值。
一般来讲erase用得比较多,不注意也容易踩坑,例如:
vector<int> vec{1, 4, 3, 2, 5, 2};
for(auto it = vec.begin(); it != vec.end(); it++)
{
if(*it < 3)
{
cout << "num is " << *it << endl;
it = vec.erase(it);
if(it == vec.end()) break;
}
}
这个代码如果不在for循环里加上最后的判断会导致错误,原因在于,当it指向最后一个2时,满足删除条件,删除后it变成了end,然后又做了++操作,导致越界。
类似的坑还有许多,这里就不一一列举了,总之,它们的共同点在于对vector进行删除时都不够优雅,需要进行一些额外的处理避免误操作。
事实上,我们完全可以使用
vec.erase(remove(vec.begin(), vec.end(), 3), vec.end());
如果再用上lambda,看起来会更酷:
vec.erase(remove_if(vec.begin(), vec.end(), [](int x){return x == 3;}), vec.end());
原文链接:
参考:
C++中Vector.erase()删除某一元素的正确用法
https://en.cppreference.com/w/cpp/algorithm/remove
原文链接: https://www.cnblogs.com/2018shawn/p/12334753.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/193332
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!