您的位置:首页 > 编程语言 > C语言/C++

C++学习笔记之erase

2015-08-10 19:47 489 查看
今天编写《C++primer》的习题9.26的小程序,主要是对erase的使用。先贴上代码。

#include <iostream>
#include <vector>
#include <list>
using namespace std;
int main(){
int a[] = {0, 1, 1, 2, 3, 5, 8, 13, 21, 55, 89 };
size_t a_size = sizeof(a)/sizeof(int);
vector<int> vec(a, a + a_size);
list<int> lis(a, a + a_size);

cout << "The original integers are: ";
for(size_t i =0; i != a_size; ++i)
cout << a[i] << " ";
cout << endl;

//erase operation on Vector
for(vector<int>::iterator iter = vec.begin(); iter != vec.end(); ++iter)
if(*iter%2 != 0)
iter = --vec.erase(iter);
cout << "Vector is: ";
for(vector<int>::iterator iter = vec.begin(); iter != vec.end(); ++iter)
cout << *iter << " ";
cout << endl;

//erase Operation on List
for(list<int>::iterator iter = lis.begin(); iter != lis.end(); ++iter)
if(*iter%2 == 0)
iter = --lis.erase(iter);
cout << "List is: ";
for(list<int>::iterator iter = lis.begin(); iter != lis.end(); ++iter)
cout << *iter << " ";
cout << endl;

return 0;
}


开始忽略了我使用erase时候地迭代器会失效,于是在for循环里面直接直接写了
erase(iter)
,结果可想而知了。erase删除容器的一个元素以后会返回之指向已删除元素的下一个元素的迭代器,因此为了能够完整遍历整个容器,就将返回的迭代器减1以后重新赋给iter,这样iter会保持有效。

erase还有另外一种形式
c.erase(b,e)
删除两个迭代器之间的元素,返回指向被删除元素段的后一个元素的迭代器。

c.pop_back()
c.pop_front()
分别删除容器 c 的最后一个和第一个元素

另外需要注意:

1. vector中的迭代器可以进行加减运算,但是 list 中的迭代器不可以。因此在在以后的编写程序过程中尽量用
++
--


2. vector中没有
c.push_front()
c.pop_front()
函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: