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

 

/*- ==========================================================
*     文件名  :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个元素
//============================

转载于:https://my.oschina.net/u/186539/blog/59770

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值