vector中erase用法注意事项
来源:互联网 发布:qq视频聊天录像软件 编辑:程序博客网 时间:2024/04/29 16:31
vector::erase():从指定容器删除指定位置的元素或某段范围内的元素
vector::erase()方法有两种重载形式
如下:
iterator erase( iterator _Where);iterator erase( iterator _First, iterator _Last);
如果是删除指定位置的元素时:
返回值是一个迭代器,指向删除元素下一个元素;
如果是删除某范围内的元素时:返回值也表示一个迭代器,指向最后一个删除元素的下一个元素;
也就是说:
vector在erase之后,指向下一个元素的位置,其实进行erase操作时将后面所有元素都向前移动,迭代器位置没有移动。itor=array.erase(itor) erase返回下一个元素的地址,相当于给itor一个新值。
看下面的程序,目的是删除数组里面的所有值为6的元素:
#include<iostream> #include<vector> using namespace std; int main() { vector<int> array; array.push_back(1); array.push_back(6); array.push_back(3); array.push_back(6); array.push_back(6); array.push_back(2); vector<int>::iterator itor; vector<int>::iterator itor2; for(itor=array.begin();itor!=array.end();) { if(6==*itor) { itor2=itor; array.erase(itor2); } itor++; } itor=array.begin(); for(itor=array.begin();itor!=array.end();) { cout<<(*itor++); } getchar(); return 0; }
运行结果输出1362,可见其中一个6并未删除,这是迭代器的问题。
原因在于erase以后,itor已经指向下一个元素了,不应该在itor++,否则会跳过下一个元素,即连续两个6时跳过了第二个6.
另外,在itor2=itor时,两个itor是一样的,这样做并无意义。可修改如下:
vector<int>::iterator itor; // vector<int>::iterator itor2; for(itor=array.begin();itor!=array.end();) { if(6==*itor) { // itor2=itor; array.erase(itor); } else { itor++; } }
或者:
vector<int>::iterator itor; for(itor=array.begin();itor!=array.end();itor++) { if(6==*itor) { array.erase(itor); itor--; } }
也可以使用remove方法:
array.earse( remove(array.begin(), array.end(),6), array.end() );
0 0
- vector中erase用法注意事项
- vector中erase用法注意事项
- vector中erase用法注意事项
- vector中erase用法注意事项
- vector中erase用法注意事项
- vector中erase用法注意事项
- vector中erase用法注意事项
- vector中erase用法注意事项
- vector中erase用法注意事项
- vector中erase用法注意事项
- vector中erase用法注意事项
- vector中erase用法注意事项
- vector中erase用法注意事项
- vector中erase用法注意事项
- vector中erase用法注意事项
- vector中erase用法注意事项
- vector中erase用法注意事项
- vector中erase用法注意事项
- 冒泡排序
- 递归实现 n的k次方
- 写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和
- strlen和sizeof的区别和联系
- 笔试题: 不使用中间变量求const字符串长度,即实现求字符串长度库函数strlen函数
- vector中erase用法注意事项
- 求数组长度sizeof
- Maven实战学习笔记 1.Maven介绍
- memset函数源码实现
- memset函数源码分析
- 强悍的 vim —— 删除空行、删除注释以及加注释解注释
- printf函数源码实现
- 【意外之中新发现——类图,序列图】
- TCP建立连接和拆除连接的过程