/*- ========================================================== * 文件名 :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 //============================