/*- ==========================================================
* 文件名 :STL_con_ite_8.cpp
* 开发人员:袁培荣
* 当前版本:1.0.0.2595
* 创建时间:2012-05-27
* 修改时间:2012-05-27
* 功能说明:STL 容器和迭代器连载8_访问顺序容器的元素
* 版权说明:版权所有 袁培荣 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[])
{
//首先,请你看本文的标题,是访问顺序容器的元素
//而非所有的容器。
//对有些容器,我们只能通过前面讲到的迭代器进行访问。
//而对于顺序容器,我们可以更多的额外访问方式。
//下面就来一一介绍。
//访问1:
//利用容器的迭代器访问。
//注意:这种方法支持所有的容器。
cout<<"访问1:"<<endl;
vector<string> vstr(10,"我是vstr的初始化值");
vector<string>::iterator siter=vstr.begin();
*siter="我是vstr的第1个元素";
siter++;
*siter="我是vstr的第2个元素";
siter=siter+8; //注意,对于所有的迭代器,++和--操作都支持
//但是像这里加上8这样的常数,我们前面说过,
//只适用于vector和deque 容器。
*siter="我是vstr的第10个元素";
siter--;
*siter="我是vstr的第9个元素";
list<string> lstr(15,"我是lstr的初始化值");
list<string>::iterator liter=lstr.begin();
*liter="我是lstr的第1个元素";
liter++;
*liter="我是lstr的第2个元素";
//list容器的迭代器不能加常数,我们不能上面那样加13去访问最后一上元素
//我们可以对用一个循环做13次 liter++; 也可以取得 lstr.end()后做--操作
liter=lstr.end();
liter--;
*liter="我是lstr的第15个元素";
liter--;
*liter="我是lstr的第14个元素";
cout<<"这里我们做好了铺垫"<<endl;
//访问2:
//back()成员函数返回容器中最后一个元素的引用。
//如果容器为空,则该函数未定义。
cout<<"访问2:"<<endl;
cout<<vstr.back()<<endl; //输出最后一个元素
cout<<lstr.back()<<endl;
//如果我们删除容器的最后一个元素
//那么原来的的倒数第二个元素就为当前的最后一个
//而back()成员函数返回的是正是这当前的最后一个
vstr.pop_back(); //删除最后一个元素
lstr.pop_back();
cout<<vstr.back()<<endl; //重新输出最后一个元素
cout<<lstr.back()<<endl; //其实就是原来的倒数第二个元素
//访问3:
//front()成员函数返回容器中第一个元素的引用。
//如果容器为空,则该函数未定义。
cout<<"访问3:"<<endl;
cout<<vstr.front()<<endl; //输出第一个元素
cout<<lstr.front()<<endl;
//如果我们删除容器的第一个元素
//那么原来的第二个元素就为当前的第一个
//而front()成员函数返回的是正是这当前的第一个
vstr.erase(vstr.begin()); //删除第一个元素
//vector容器没有pop_front()成员函数可用
lstr.pop_front(); //list容器有pop_front()成员函数可用
cout<<vstr.front()<<endl; //重新输出第一个元素
cout<<lstr.front()<<endl; //其实就是原来的第二个元素
//访问4:
//容器对象名[n]式的下标访问,返回下标为n的元素的引用。
//如果下标越界,则该操作未定义。
//注意:此方法仅适用于vector和deque容器。
cout<<"访问4:"<<endl;
cout<<vstr[0]<<endl;
vstr[5]="在访问4中修改";
cout<<vstr[5]<<endl;
cout<<vstr[7]<<endl; //原来共有10个元素,上面删除了两个
//因此vstr[7]是当前的最后一个
//下标不要越界,
//编译器检查不到越界
//但会有严重的运行错误
//访问5:
//at(n)成员函数返回容器中下标为n的元素的引用。
//如果下标越界,则该函数未定义。
//注意:此方法仅适用于vector和deque容器。
cout<<"访问5:"<<endl;
cout<<vstr.at(0)<<endl;
vstr.at(5)="在访问5中修改";
cout<<vstr.at(5)<<endl;
cout<<vstr.at(7)<<endl;
//综上,vector和deque容器的访问方式最多
//而且它们的迭代器可以与常数进行加减。
//虽然所有容器都可以用迭代器访问
//但显然vector和deque容器的迭代器更灵活
//主要是它们支持随机访问。
//而访问4和访问5正是随机访问。
//另外,这里的访问返回的都是元素的引用,
//因此都是可以做左值和右值的。
return 0;
}
//============================
//运行结果:
//============================
// 访问1:
// 这里我们做好了铺垫
// 访问2:
// 我是vstr的第10个元素
// 我是lstr的第15个元素
// 我是vstr的第9个元素
// 我是lstr的第14个元素
// 访问3:
// 我是vstr的第1个元素
// 我是lstr的第1个元素
// 我是vstr的第2个元素
// 我是lstr的第2个元素
// 访问4:
// 我是vstr的第2个元素
// 在访问4中修改
// 我是vstr的第9个元素
// 访问5:
// 我是vstr的第2个元素
// 在访问5中修改
// 我是vstr的第9个元素
//============================