C++学习笔记之erase

来源:互联网 发布:明道办公软件登陆 编辑:程序博客网 时间:2024/06/02 04:35

今天编写《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()函数。

0 0
原创粉丝点击