/*- ========================================================== * 文件名 :STL_con_ite_6.cpp * 開發人員:袁培榮 * 當前版本:1.0.0.2595 * 建立時間:2012-05-24 * 修改時間:2012-05-24 * 功能說明:STL 容器和迭代器連載6_順序容器的操做3 * 版權說明:版權全部 袁培榮 YuanPeirong * 編譯環境:Windows 7(x64) SP1 簡體中文專業版 * 編譯器: Visual Studio 2010 SP1(中文旗艦版) MinGW 20120426 GNU GCC 4.6.2 Visual C++ 6.0 SP6(中文企業版) - ==========================================================*/ #include <iostream> #include <vector> #include <list> #include <deque> #include <string> using std::cout; using std::endl; using std::vector; using std::list; using std::deque; using std::string; int main(int argc, char* argv[]) { //下面來介紹刪除容器內元素的相關操做 //先定義一個容器,並添加101個元素。 vector<int> v1; for(int i=0; i!=101; i++) //C++程序員習慣於用i!=101,而不是i<101 v1.push_back(i); cout<<"在全部刪除操做前v1.size()="<<v1.size()<<endl; //第一種方法: //erase(p) :刪除迭代器p所指向的元素 //返回指向被刪除元素的下一位置的迭代器。 //注意:p必須真實地指向實際存在的元素。 cout<<"第一種方法:"<<endl; cout<<"刪除前v1的第96個元素值是(方法1輸出):"<<*(v1.begin()+95)<<endl; cout<<"刪除前v1的第96個元素值是(方法2輸出):"<<v1[95]<<endl; //咱們把第96個元素刪除 vector<int>::iterator iter1=v1.erase(v1.begin()+95); //驗證: cout<<"刪除後v1.size()="<<v1.size()<<endl; cout<<"刪除後v1的第96個元素值是(方法1輸出):"<<*iter1<<endl; cout<<"刪除後v1的第96個元素值是(方法2輸出):"<<v1[95]<<endl; //第二種方法: //erase(b,e) :刪除迭代器b,e所指向的元素造成的左閉合區間 //返回指向被刪除的最後一個元素的下一位置的迭代器。 cout<<"第二種方法:"<<endl; cout<<"刪除前v1的第81個元素值是:"<<*(v1.begin()+80)<<endl; cout<<"刪除前v1的第82個元素值是:"<<*(v1.begin()+81)<<endl; cout<<"刪除前v1的第83個元素值是:"<<*(v1.begin()+82)<<endl; //咱們把第81,82,83三個元素刪除 iter1=v1.erase(v1.begin()+80, v1.begin()+83); //驗證: cout<<"刪除後v1.size()="<<v1.size()<<endl; cout<<"刪除後v1的第81個元素值是(方法1輸出):"<<*iter1<<endl; cout<<"刪除後v1的第81個元素值是(方法2輸出):"<<*(v1.begin()+80)<<endl; cout<<"刪除後v1的第82個元素值是:"<<*(v1.begin()+81)<<endl; cout<<"刪除後v1的第83個元素值是:"<<*(v1.begin()+82)<<endl; //第三種方法: //pop_back() 刪除容器的最後一個元素,返回void類型 cout<<"第三種方法:"<<endl; cout<<"刪除前v1的最後一個元素值是:"<<*(v1.end()-1)<<endl; if(v1.size()!=0) //防止容器爲空時,刪除操做引起錯誤 v1.pop_back(); //驗證: cout<<"刪除後v1.size()="<<v1.size()<<endl; cout<<"刪除後v1的最後一個元素值是:"<<*(v1.end()-1)<<endl; //第四種方法: //pop_front() 刪除容器的第一個元素,返回void類型 //值得注意的是,這種方法只能用於list和deque容器 list<int> l1(3,0); *l1.begin()=0; //爲便於區分元素,將各修改爲不相同 //下面指出修改list容器的元素時的兩種錯誤 //l1[1]=1; //list容器不支持l1[0]這樣的下標訪問(下面會講) //*(l1.begin()+2)=2; //list容器的迭代器不能與數值相加(複習一下前面) list<int>::iterator iter2=l1.begin(); iter2++; //迭代器的++操做是對全部容器都支持的 *(iter2)=1; iter2++; *(iter2)=2; cout<<"第四種方法:"<<endl; cout<<"刪除前l1.size()="<<l1.size()<<endl; cout<<"刪除前l1的第一個元素值是:"<<*l1.begin()<<endl; if(!l1.empty()) //防止容器爲空時,刪除操做引起錯誤 l1.pop_front(); //empty()用來判斷容器是否爲空,下面會講 //驗證: cout<<"刪除後l1.size()="<<l1.size()<<endl; cout<<"刪除後l1的第一個元素值是:"<<*l1.begin()<<endl; //雖然第四種方法pop_front(t)只支持list和deque容器 //但咱們用第一種方法的一個特例就能和作到第二種方法一樣的效果: //例如: cout<<"用第一種方法的特例實現第四種方法:"<<endl; cout<<"刪除前v1.size()="<<v1.size()<<endl; cout<<"刪除前v1的第一個元素值是:"<<*v1.begin()<<endl; v1.erase(v1.begin()); //驗證: cout<<"刪除後v1.size()="<<v1.size()<<endl; cout<<"刪除後v1的第一個元素值是:"<<*v1.begin()<<endl; //這樣,咱們能夠爲不支持第四種方法的容器擴展這一種方法 //第五種方法: //clear() 刪除容器內的全部元素,返回void類型 cout<<"第五種方法:"<<endl; cout<<"清空前v1.size()="<<v1.size()<<endl; cout<<"清空前l1.size()="<<l1.size()<<endl; //清空v1和l1 v1.clear(); l1.clear(); //驗證: cout<<"清空後v1.size()="<<v1.size()<<endl; cout<<"清空後l1.size()="<<l1.size()<<endl; return 0; } //============================ //運行結果: //============================ // 在全部刪除操做前v1.size()=101 // 第一種方法: // 刪除前v1的第96個元素值是(方法1輸出):95 // 刪除前v1的第96個元素值是(方法2輸出):95 // 刪除後v1.size()=100 // 刪除後v1的第96個元素值是(方法1輸出):96 // 刪除後v1的第96個元素值是(方法2輸出):96 // 第二種方法: // 刪除前v1的第81個元素值是:80 // 刪除前v1的第82個元素值是:81 // 刪除前v1的第83個元素值是:82 // 刪除後v1.size()=97 // 刪除後v1的第81個元素值是(方法1輸出):83 // 刪除後v1的第81個元素值是(方法2輸出):83 // 刪除後v1的第82個元素值是:84 // 刪除後v1的第83個元素值是:85 // 第三種方法: // 刪除前v1的最後一個元素值是:100 // 刪除後v1.size()=96 // 刪除後v1的最後一個元素值是:99 // 第四種方法: // 刪除前l1.size()=3 // 刪除前l1的第一個元素值是:0 // 刪除後l1.size()=2 // 刪除後l1的第一個元素值是:1 // 用第一種方法的特例實現第四種方法: // 刪除前v1.size()=96 // 刪除前v1的第一個元素值是:0 // 刪除後v1.size()=95 // 刪除後v1的第一個元素值是:1 // 第五種方法: // 清空前v1.size()=95 // 清空前l1.size()=2 // 清空後v1.size()=0 // 清空後l1.size()=0 //============================