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