STL 容器和迭代器连载6_顺序容器的操作3

  1 /*- ==========================================================
  2 *     文件名  :STL_con_ite_6.cpp
  3 *     开发人员:袁培荣
  4 *     当前版本:1.0.0.2595
  5 *     创建时间:2012-05-24
  6 *     修改时间:2012-05-24
  7 *     功能说明:STL 容器和迭代器连载6_顺序容器的操作3
  8 *     版权说明:版权所有 袁培荣 YuanPeirong 
  9 *     编译环境:Windows 7(x64) SP1 简体中文专业版
 10 *     编译器:  Visual Studio 2010 SP1(中文旗舰版)
 11                 MinGW 20120426 GNU GCC 4.6.2
 12                 Visual C++ 6.0 SP6(中文企业版)
 13 - ==========================================================*/
 14 
 15 #include <iostream>
 16 #include <vector>
 17 #include <list>
 18 #include <deque>
 19 #include <string>
 20 
 21 using std::cout;
 22 using std::endl;
 23 using std::vector;
 24 using std::list;
 25 using std::deque;
 26 using std::string;
 27 
 28 int main(int argc, char* argv[])
 29 {
 30     //下面来介绍删除容器内元素的相关操作
 31     
 32     //先定义一个容器,并添加101个元素。
 33     vector<int> v1;
 34     for(int i=0; i!=101; i++) //C++程序员习惯于用i!=101,而不是i<101
 35         v1.push_back(i);
 36     cout<<"在所有删除操作前v1.size()="<<v1.size()<<endl;
 37     
 38     //第一种方法:
 39     //erase(p) :删除迭代器p所指向的元素
 40     //返回指向被删除元素的下一位置的迭代器。
 41     //注意:p必须真实地指向实际存在的元素。
 42     cout<<"第一种方法:"<<endl;
 43     cout<<"删除前v1的第96个元素值是(方法1输出):"<<*(v1.begin()+95)<<endl;
 44     cout<<"删除前v1的第96个元素值是(方法2输出):"<<v1[95]<<endl;
 45     //我们把第96个元素删除
 46     vector<int>::iterator iter1=v1.erase(v1.begin()+95);
 47     //验证:
 48     cout<<"删除后v1.size()="<<v1.size()<<endl;
 49     cout<<"删除后v1的第96个元素值是(方法1输出):"<<*iter1<<endl;
 50     cout<<"删除后v1的第96个元素值是(方法2输出):"<<v1[95]<<endl;
 51     
 52     //第二种方法:
 53     //erase(b,e) :删除迭代器b,e所指向的元素形成的左闭合区间
 54     //返回指向被删除的最后一个元素的下一位置的迭代器。
 55     cout<<"第二种方法:"<<endl;
 56     cout<<"删除前v1的第81个元素值是:"<<*(v1.begin()+80)<<endl;
 57     cout<<"删除前v1的第82个元素值是:"<<*(v1.begin()+81)<<endl;
 58     cout<<"删除前v1的第83个元素值是:"<<*(v1.begin()+82)<<endl;
 59     //我们把第81,82,83三个元素删除
 60     iter1=v1.erase(v1.begin()+80, v1.begin()+83);
 61     //验证:
 62     cout<<"删除后v1.size()="<<v1.size()<<endl;
 63     cout<<"删除后v1的第81个元素值是(方法1输出):"<<*iter1<<endl;
 64     cout<<"删除后v1的第81个元素值是(方法2输出):"<<*(v1.begin()+80)<<endl;
 65     cout<<"删除后v1的第82个元素值是:"<<*(v1.begin()+81)<<endl;
 66     cout<<"删除后v1的第83个元素值是:"<<*(v1.begin()+82)<<endl;
 67     
 68     //第三种方法:
 69     //pop_back() 删除容器的最后一个元素,返回void类型
 70     cout<<"第三种方法:"<<endl;
 71     cout<<"删除前v1的最后一个元素值是:"<<*(v1.end()-1)<<endl;
 72     if(v1.size()!=0)    //防止容器为空时,删除操作引发错误
 73         v1.pop_back();
 74     //验证:
 75     cout<<"删除后v1.size()="<<v1.size()<<endl;
 76     cout<<"删除后v1的最后一个元素值是:"<<*(v1.end()-1)<<endl;
 77     
 78     //第四种方法:
 79     //pop_front() 删除容器的第一个元素,返回void类型
 80     //值得注意的是,这种方法只能用于list和deque容器
 81     list<int> l1(3,0);
 82     *l1.begin()=0;      //为便于区分元素,将各修改成不相同
 83     //下面指出修改list容器的元素时的两种错误
 84     //l1[1]=1;           //list容器不支持l1[0]这样的下标访问(下面会讲)
 85     //*(l1.begin()+2)=2; //list容器的迭代器不能与数值相加(复习一下前面)
 86     list<int>::iterator iter2=l1.begin();
 87     iter2++;             //迭代器的++操作是对所有容器都支持的
 88     *(iter2)=1;
 89     iter2++;
 90     *(iter2)=2;
 91     cout<<"第四种方法:"<<endl;
 92     cout<<"删除前l1.size()="<<l1.size()<<endl;
 93     cout<<"删除前l1的第一个元素值是:"<<*l1.begin()<<endl;
 94     if(!l1.empty())     //防止容器为空时,删除操作引发错误
 95         l1.pop_front(); //empty()用来判断容器是否为空,下面会讲
 96     //验证:
 97     cout<<"删除后l1.size()="<<l1.size()<<endl;
 98     cout<<"删除后l1的第一个元素值是:"<<*l1.begin()<<endl;
 99     
100     //虽然第四种方法pop_front(t)只支持list和deque容器
101     //但我们用第一种方法的一个特例就能和做到第二种方法同样的效果:
102     //例如:
103     cout<<"用第一种方法的特例实现第四种方法:"<<endl;
104     cout<<"删除前v1.size()="<<v1.size()<<endl;
105     cout<<"删除前v1的第一个元素值是:"<<*v1.begin()<<endl;
106     v1.erase(v1.begin());
107     //验证:
108     cout<<"删除后v1.size()="<<v1.size()<<endl;
109     cout<<"删除后v1的第一个元素值是:"<<*v1.begin()<<endl;
110     //这样,我们可以为不支持第四种方法的容器扩展这一种方法
111     
112     //第五种方法:
113     //clear() 删除容器内的所有元素,返回void类型
114     cout<<"第五种方法:"<<endl;
115     cout<<"清空前v1.size()="<<v1.size()<<endl;
116     cout<<"清空前l1.size()="<<l1.size()<<endl;
117     //清空v1和l1
118     v1.clear();
119     l1.clear();
120     //验证:
121     cout<<"清空后v1.size()="<<v1.size()<<endl;
122     cout<<"清空后l1.size()="<<l1.size()<<endl;
123     
124     
125     
126     return 0;
127 }
128 
129 
130 //============================
131 //运行结果:
132 //============================
133 // 在所有删除操作前v1.size()=101
134 // 第一种方法:
135 // 删除前v1的第96个元素值是(方法1输出):95
136 // 删除前v1的第96个元素值是(方法2输出):95
137 // 删除后v1.size()=100
138 // 删除后v1的第96个元素值是(方法1输出):96
139 // 删除后v1的第96个元素值是(方法2输出):96
140 // 第二种方法:
141 // 删除前v1的第81个元素值是:80
142 // 删除前v1的第82个元素值是:81
143 // 删除前v1的第83个元素值是:82
144 // 删除后v1.size()=97
145 // 删除后v1的第81个元素值是(方法1输出):83
146 // 删除后v1的第81个元素值是(方法2输出):83
147 // 删除后v1的第82个元素值是:84
148 // 删除后v1的第83个元素值是:85
149 // 第三种方法:
150 // 删除前v1的最后一个元素值是:100
151 // 删除后v1.size()=96
152 // 删除后v1的最后一个元素值是:99
153 // 第四种方法:
154 // 删除前l1.size()=3
155 // 删除前l1的第一个元素值是:0
156 // 删除后l1.size()=2
157 // 删除后l1的第一个元素值是:1
158 // 用第一种方法的特例实现第四种方法:
159 // 删除前v1.size()=96
160 // 删除前v1的第一个元素值是:0
161 // 删除后v1.size()=95
162 // 删除后v1的第一个元素值是:1
163 // 第五种方法:
164 // 清空前v1.size()=95
165 // 清空前l1.size()=2
166 // 清空后v1.size()=0
167 // 清空后l1.size()=0
168 //============================

 

posted @ 2012-05-24 16:42  天远  阅读(166)  评论(0)    收藏  举报

版权所有 © 2010-2020 YuanPeirong TianYuan All Rights Reserved. Powered By 天远