DEBUG C++ ——迭代器iterator的誤用

來源:互聯網
上載者:User

問題:已知一組資料,刪除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; 
}

容器的迭代器好用,但一定要注意使用方式。不要不考慮後果

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.