STL 容器和迭代器连载8_访问顺序容器的元素

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

 

posted @ 2012-05-27 14:05  天远  阅读(321)  评论(0)    收藏  举报

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