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個元素
//============================
相關文章
相關標籤/搜索