1 /*- ==========================================================
2 * 文件名 :STL_con_ite_8.cpp
3 * 开发人员:袁培荣
4 * 当前版本:1.0.0.2595
5 * 创建时间:2012-05-27
6 * 修改时间:2012-05-27
7 * 功能说明:STL 容器和迭代器连载8_访问顺序容器的元素
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 //对有些容器,我们只能通过前面讲到的迭代器进行访问。
33 //而对于顺序容器,我们可以更多的额外访问方式。
34 //下面就来一一介绍。
35
36 //访问1:
37 //利用容器的迭代器访问。
38 //注意:这种方法支持所有的容器。
39 cout<<"访问1:"<<endl;
40 vector<string> vstr(10,"我是vstr的初始化值");
41 vector<string>::iterator siter=vstr.begin();
42 *siter="我是vstr的第1个元素";
43 siter++;
44 *siter="我是vstr的第2个元素";
45 siter=siter+8; //注意,对于所有的迭代器,++和--操作都支持
46 //但是像这里加上8这样的常数,我们前面说过,
47 //只适用于vector和deque 容器。
48 *siter="我是vstr的第10个元素";
49 siter--;
50 *siter="我是vstr的第9个元素";
51 list<string> lstr(15,"我是lstr的初始化值");
52 list<string>::iterator liter=lstr.begin();
53 *liter="我是lstr的第1个元素";
54 liter++;
55 *liter="我是lstr的第2个元素";
56 //list容器的迭代器不能加常数,我们不能上面那样加13去访问最后一上元素
57 //我们可以对用一个循环做13次 liter++; 也可以取得 lstr.end()后做--操作
58 liter=lstr.end();
59 liter--;
60 *liter="我是lstr的第15个元素";
61 liter--;
62 *liter="我是lstr的第14个元素";
63 cout<<"这里我们做好了铺垫"<<endl;
64
65 //访问2:
66 //back()成员函数返回容器中最后一个元素的引用。
67 //如果容器为空,则该函数未定义。
68 cout<<"访问2:"<<endl;
69 cout<<vstr.back()<<endl; //输出最后一个元素
70 cout<<lstr.back()<<endl;
71 //如果我们删除容器的最后一个元素
72 //那么原来的的倒数第二个元素就为当前的最后一个
73 //而back()成员函数返回的是正是这当前的最后一个
74 vstr.pop_back(); //删除最后一个元素
75 lstr.pop_back();
76 cout<<vstr.back()<<endl; //重新输出最后一个元素
77 cout<<lstr.back()<<endl; //其实就是原来的倒数第二个元素
78
79
80 //访问3:
81 //front()成员函数返回容器中第一个元素的引用。
82 //如果容器为空,则该函数未定义。
83 cout<<"访问3:"<<endl;
84 cout<<vstr.front()<<endl; //输出第一个元素
85 cout<<lstr.front()<<endl;
86 //如果我们删除容器的第一个元素
87 //那么原来的第二个元素就为当前的第一个
88 //而front()成员函数返回的是正是这当前的第一个
89 vstr.erase(vstr.begin()); //删除第一个元素
90 //vector容器没有pop_front()成员函数可用
91 lstr.pop_front(); //list容器有pop_front()成员函数可用
92 cout<<vstr.front()<<endl; //重新输出第一个元素
93 cout<<lstr.front()<<endl; //其实就是原来的第二个元素
94
95
96 //访问4:
97 //容器对象名[n]式的下标访问,返回下标为n的元素的引用。
98 //如果下标越界,则该操作未定义。
99 //注意:此方法仅适用于vector和deque容器。
100 cout<<"访问4:"<<endl;
101 cout<<vstr[0]<<endl;
102 vstr[5]="在访问4中修改";
103 cout<<vstr[5]<<endl;
104 cout<<vstr[7]<<endl; //原来共有10个元素,上面删除了两个
105 //因此vstr[7]是当前的最后一个
106 //下标不要越界,
107 //编译器检查不到越界
108 //但会有严重的运行错误
109
110 //访问5:
111 //at(n)成员函数返回容器中下标为n的元素的引用。
112 //如果下标越界,则该函数未定义。
113 //注意:此方法仅适用于vector和deque容器。
114 cout<<"访问5:"<<endl;
115 cout<<vstr.at(0)<<endl;
116 vstr.at(5)="在访问5中修改";
117 cout<<vstr.at(5)<<endl;
118 cout<<vstr.at(7)<<endl;
119
120 //综上,vector和deque容器的访问方式最多
121 //而且它们的迭代器可以与常数进行加减。
122 //虽然所有容器都可以用迭代器访问
123 //但显然vector和deque容器的迭代器更灵活
124 //主要是它们支持随机访问。
125 //而访问4和访问5正是随机访问。
126 //另外,这里的访问返回的都是元素的引用,
127 //因此都是可以做左值和右值的。
128
129 return 0;
130 }
131
132
133 //============================
134 //运行结果:
135 //============================
136 // 访问1:
137 // 这里我们做好了铺垫
138 // 访问2:
139 // 我是vstr的第10个元素
140 // 我是lstr的第15个元素
141 // 我是vstr的第9个元素
142 // 我是lstr的第14个元素
143 // 访问3:
144 // 我是vstr的第1个元素
145 // 我是lstr的第1个元素
146 // 我是vstr的第2个元素
147 // 我是lstr的第2个元素
148 // 访问4:
149 // 我是vstr的第2个元素
150 // 在访问4中修改
151 // 我是vstr的第9个元素
152 // 访问5:
153 // 我是vstr的第2个元素
154 // 在访问5中修改
155 // 我是vstr的第9个元素
156 //============================