問題:已知一組資料,刪除ilist的所有奇數元素。
關鍵代碼:(C++ Primer 第三版給出答案如下)
for(iter=ilist.begin();iter!=ilist.end();++iter)
{
if(*iter%2==1)
ilist.erase(iter);
}
這個程式是有嚴重問題的,當遇到一個奇數元素時,就會調用 ilist.erase(iter);,這個時候每刪除一次,列表的大小都會改變。而程式根本就沒有考慮這個問題,所以我引入了一個過渡列表ilist1.
#include<iostream>
#include<list>
using namespace std;
int main()
{
int ia[]={0,1,1,2,3,5,8,13,21,55,89};//已知一組資料
list<int> ilist(ia,ia+11);
list<int> ilist1;
//for(int i=0;i<11;++i)
//ilist.push_back(ia[i]);
list<int>::iterator iter;
list<int>::iterator iter1;
for(iter=ilist.begin();iter!=ilist.end();++iter)
{
if(*iter%2==1)
ilist.erase(iter);//試圖刪除奇數元素,結果為:Error!!
ilist1.push_back(*iter);//引入一個過渡list。
}
ilist.erase(ilist.begin(),ilist.end());//ilist.begin(),ilist.end()
for(iter1=ilist1.begin();iter1!=ilist1.end();++iter1)
{
ilist.push_back(*iter1);
}
//list<int> ilist3(ilist1.begin(),ilist1.end());
cout<<"{";
for(iter=ilist.begin();iter!=ilist.end();++iter)
cout<<*iter<<",";
cout<<"}/n";
return 0;
}
容器的迭代器好用,但一定要注意使用方式。不要不考慮後果