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 //============================