向量容器的使用

向量   轉自:http://hi.baidu.com/%C3%CE%CF%EB%B7%E7%D1%EF/blog/item/af672ecb08cb8c1dbf09e659.html
   C++中的標準模板庫(STL, Standard Template Library)有三個主要組成部分:
容器
迭代器
算法

而STL容器可以分爲三類:
順序容器
關聯容器
容器適配器

其中順序容器又有三種預定義的容器:
向量(Vector)
雙端隊列(Deque)
表(List)

終於引出了向量。
向量容器使用動態數組存儲、管理對象。因爲數組是一個隨機訪問數據結構,所以可以隨機訪問向量中的元素。在數組中間或是開始處插入一個元素是費時的,特別是在數組非常大的時候更是如此。然而在數組末端插入元素卻很快。
實現向量容器的類名是vector(容器是類模板)。包含vector類的頭文件名是vector。所以,如果要在程序裏使用向量容器,就要在程序中包含下面語句:
#include <vector>
此外,在定義向量類型對象時,必須指定該對象的類型,因爲vector類是一個類模板。例如,語句:
vector<int> intList;    
將intList聲明爲一個元素類型爲int的向量容器對象。類似地,語句:
vector<string> stringList;將stringList聲明爲一個元素類型爲string的向量容器對象。

聲明向量對象
vector類包含了多個構造函數,其中包括默認構造函數。因此,可以通過多種方式來聲明和初始化向量容器。表一描述了怎樣聲明和初始化指定類型的向量容器。

                          表一     各種聲明和初始向量容器的方法

語句         作用
vector<elementType> vecList;      創建一個沒有任何元素的空向量vecList(使用默認構造函數)
vector<elementType> vecList(otherVecList) 創建一個向量vecList,並使用向量otherVecList中的元素初始化該向量。向量vecList與向量otherVecList的類型相同
vector<elementType> vecLIst(size);     創建一個大小爲size的向量vecList,並使用默認構造函數初始化該向量
vector<elementType> vecList(n,elem);     創建一個大小爲n的向量vecList,該向量中所有的n個元素都初始化爲elem
vector<elementType> vecList(begin,end);     創建一個向量vecList,並初始化該向量(begin,end)中的元素。即,從begin到end-1之間的所有元素

在介紹瞭如何聲明向量順序容器之後,讓我們開始討論如何操作向量容器中的數據。首先,必須要知道下面幾種基本操作:
      元素插入
      元素刪除
      遍歷向量容器中的元素
假設vecList是一個向量類型容器。表二給出了在vecList中插入元素和刪除元素的操作,這些操作是vector類的成員函數。表二還說明了如何使用這些操作。

                      表二     向量容器上的各種操作

語句                作用
vecList.clear()       從容器中刪除所有元素
vecList.erase(position)      刪除由position指定的位置上的元素
vecList.erase(beg,end)      刪除從beg到end-1之間的所有元素
vecList.insert(position, elem)     將elem的一個拷貝插入到由position指定的位置上,並返回新元素的位置
vecList.inser(position, n, elem) 將elem的n個拷貝插入到由 position指定的位置上
vecList.insert(position, beg, end) 將從beg到end-1之間的所有元素的拷貝插入到vecList中由position指定的位置上
vecList.push_back(elem)      將elem的一個拷貝插入致List的末尾
vecList.pop_back()      刪除最後元素
vecList.resize(num)      將元素個數改爲num。如果size()增加,默認的構造函數負責創建這些新元素
vecList.resize(num, elem)     將元素個數改爲num。如果size()增加,默認的構造函數將這些新元素初始化爲elem

在向量容器中聲明迭代器
vector類包含了一個typedef iterator,這是一個public成員。通過iterator,可以聲明向量容器中的迭代器。例如,語句:
vector<int>::iterator intVeciter;        將intVecIter聲明爲int類型的向量容器迭代器。
因爲iterator是一個定義在vector類中的typedef,所以必須使用容器名(vector)、容器元素類型和作用域符來使用iterator。
表達式:
++intVecIter
將迭代器intVecIter加1,使其指向容器中的下一個元素。表達式:*intVecIter
返回當前迭代器位置上的元素。
注意,迭代器上的這些操作和指針上的相應操作是相同的。運算符*作爲單目運算符使用時,稱爲遞引用運算符。
下面將討論如何使用迭代器來操作向量容器中的數據。假設有下面語句:
vector<int> intList;
vector<int>::iterator intVecIter;
第一行中的語句將intList聲明爲元素爲int類型的向量容器。第二行中的語句將intVecIter聲明爲元素爲int類型的向量容器的迭代器。

容器與函數begin和end
所有容器都包含成員函數begin和end。函數begin返回容器中第一個元素的位置;函數end返回容器中最後一個元素的位置。這兩個函數都沒有參數。在執行下面語句:
intVecIter = intList.begin();
迭代器intVecIter指向容器intList中第一個元素。
下面的for循環將intList中所有元素輸出互標準輸出設備上:
for (intVecIter = intList.begin(); intVecIter != intList.end();
          cout<<*intVecList<<"     ";
可以通過表三中給出的操作直接訪問向量容器中的元素。

       表三 訪問向量容器中元素的操作

表達式      作用
vecList.at(index) 返回由index指定的位置上的元素
vecList[index]     返回由index指定的位置上的元素
vecList.front()     返回第一個元素 (不檢查容器是否爲空)
vecList.back()     返回最後一個元素(不檢查容器是否爲空)

表三說明:可以按照數組的方式來處理向量中的元素(注意,在C++中,數組下標從0始。,向量容器中第一個元素的位置也是0)。
徽號類中還包含:返回容器中當前元素個數的成員函數,返回可以插入到容器中的元素的最大個數的成員函數等。表四描述其中 一些操作(假設vecCont是向量容器)。

    表四 計算向量容器大小的操作

表達式      作用
vecCont.capacity() 返回不重新分配空間可以插入到容器vecCont中的元素的最大個數
vecCont.empty()     容器vecCont爲空,返回true;否則,返回false
vecCont.size()     返回容器vecCont中當前的個數
vecCont.max_size() 返回可以插入到容器vecCont中的元素的最大個數


下面給出一個樣本程序供進一步認識這些函數的用法:

#include <iostream>

#include <vector>

using namespace std;


int main()

{

vector<int> intList;

int i;

intList.push_back(13);

intList.push_back(75);

intList.push_back(28);

intList.push_back(35);

cout<<"Line 1: List Elements: ";

for(i=0;i<4;i++)cout<<intList[i]<<"    ";

for(i=0;i<4;i++)intList[i] *=2;

cout<<"Line 2: List Elements: ";

for(i=0;i<4;i++)cout<<intList[i]<<"    ";

cout<<endl;

vector<int>::iterator listIt;

cout<<"Line 30:list Elements: ";

for(listIt=intList.begin();listIt != intList.end();++listIt)cout<<*lintIt<<"    ";

cout<<endl;

listIt=intList.begin();

++listIt;

++listIt;

intList.insert(listIt,88);

cout<<"Line 4:List Elements: ";

for(listIt = intList.begin();listIt != intList.end();++listIt)cout<<*listIt<<"    ";

cout<<endl;

return 0;

}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章