今天編寫《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()
函數。