c++ vector容器通过迭代器删除元素中奇数问题

浏览:6日期:2023-04-27

问题描述

vector中的元素{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}。为什么使用下面的方法可以删除vector容器的偶数

for(auto vbegin = va.begin(); vbegin != va.end(); ++vbegin){ if(!(*vbegin % 2)) {va.erase(vbegin); }}

而当使用类似的方法删除奇数时会报错代码如下,错误提示:Signal: SIGSEGV (Segmentation fault)

for(auto vbegin = va.begin(); vbegin != va.end(); ++vbegin) {if(*vbegin % 2){ va.erase(vbegin);} }

问题解答

回答1:

楼上的方案将迭代器赋值给begin()是可以达到效果的,但是每次都会重头开始遍历,降低了效率。而另一个复制迭代器会遇到越界的问题。这是我的方案:

{ std::vector<int> vec = {1,2,3,4,5,6,7,8,9}; auto itr = vec.begin(); while (itr != vec.end()) {if (*itr % 2) { itr = vec.erase(itr);} else { itr++;} }//done} 回答2:

C++ 的迭代器在删除(erase)之后就失效了,所以在 va.erase(vbegin); 执行后 ++vbegin 的效果是未知的。

建议在if块内定义一个临时的迭代器用来删除容器元素

if( any condition about vbegin ){ vector<int>::iterator element_to_delete = vbegin; ++vbegin; va.erase(element_to_delete);}回答3:

两种都错了,因为erase调用之后迭代器会失效,你需要

va.erase(vbegin);vbegin = va.begin();

查查资料,去弄明白erase咋回事

相关文章: