C 中的向量

2021-06-21 01:03:21 字數 4159 閱讀 4978

c++中的標準模板庫(stl, standard template library)有三個主要組成部分:容器、迭代器、演算法

而stl容器可以分為三類:順序容器、關聯容器、容器介面卡

順序容器又有三種預定義的容器:向量(vector)、雙端佇列(deque)、表(list)

向量:

訪問向量中的元素。在陣列中間或是開始處插入乙個元素是費時的,特別是在陣列非常大的時候更是如此。然而在陣列末端插入元素卻很快。實現向量容器的類名是vector(容器是類模板)。包含vector類的頭檔名是vector。所以,如果要在程式裡使用向量容器,就要在程式中包含下面語句:#include 此外,在定義向量型別物件時,必須指定該物件的型別,因為vector類是乙個類模板。例如,語句:vectorintlist-----將intlist宣告為乙個元素型別為int的向量容器物件。

類似地,語句:vectorstringlist-----將stringlist宣告為乙個元素型別為string的向量容器物件。

宣告向量物件: vector類包含了多個建構函式,其中包括預設建構函式。因此,可以通過多種方式來

明和初始化向量容器。表一描述了怎樣宣告和初始化指定型別的向量容器。

表一  各種宣告和初始向量容器的方法:

語句-----作用

1).vectorveclist;-----建立乙個沒有任何元素的空向量veclist(使用預設建構函式)

2).vectorveclist(otherveclist)----建立乙個向量veclist,並使用向量otherveclist中的元素初始化該向量。向量veclist與向量otherveclist的型別相同

3).vectorveclist(size)----建立乙個大小為size的向量veclist,並使用預設建構函式初始化該向量

4).vectorveclist(n,elem)----建立乙個大小為n的向量veclist,該向量中所有的n個元素都初始化為elem

5).vectorveclist(begin,end)----建立乙個向量veclist,並初始化該向量(begin,end)中的元素。即,從begin到end-1之間的所有元素

在介紹了如何宣告向量順序容器之後,讓我們開始討論如何操作向量容器中的資料。首先,必須要知道下面幾種基本操作:

元素插入、元素刪除、遍歷向量容器中的元素

假設veclist是乙個向量型別容器。表二給出了在veclist中插入元素和刪除元素的操作,這些操作是vector類的成員函式。表二還說明了如何使用這些操作。

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

語句 ----作用

1). veclist.clear()----從容器中刪除所有元素

2). veclist.erase(position)----刪除由position指定的位置上的元素

3). veclist.erase(beg,end)----刪除從beg到end-1之間的所有元素

4). veclist.insert(position, elem)----將elem的乙個拷貝插入到由position指定的位置上,並返回新元素的位置

5). veclist.insert(position, n, elem)----將elem的n個拷貝插入到由 position指定的位置上

6). veclist.insert(position, beg, end)----將從beg到end-1之間的所有元素的拷貝插入到veclist中由position指定的位置上

7). veclist.push_back(elem)----將elem的乙個拷貝插入致list的末尾

8). veclist.pop_back()----刪除最後元素

9). veclist.resize(num)----將元素個數改為num。如果size()增加,預設的建構函式負責建立這些新元素

10). veclist.resize(num, elem)----將元素個數改為num。如果size()增加,預設的建構函式將這些新元素初始化為elem

在向量容器中宣告迭代器 vector類包含了乙個typedef iterator,這是乙個public成員。通過iterator,可以宣告向

容器中的迭代器。

例如,語句:vector::iterator intveciter----將intveciter宣告為int型別的向量容器迭代器。因為iterator是乙個定義在vector類中的typedef,所以必須使用容器名(vector)、容器元素型別和作用域符來使用iterator。

表示式:++intveciter----將迭代器intveciter加1,使其指向容器中的下乙個元素。

表示式:*intveciter----返回當前迭代器位置上的元素。注意,迭代器上的這些操作和指標上的相應操作是相同的。運算子*作為單目運算子使用時,稱為遞引用運算子。

下面將討論如何使用迭代器來操作向量容器中的資料。假設有下面語句: vectorintlist; vector::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<<" "; 可以通過表三中給出的操作直接訪問向量容器中的元素。

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

表示式-----作用

1). veclist.at(index)----返回由index指定的位置上的元素

2). veclist[index]----返回由index指定的位置上的元素

3). veclist.front()----返回第乙個元素 (不檢查容器是否為空)

4). veclist.back()----返回最後乙個元素(不檢查容器是否為空)

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

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

表示式----作用

1). veccont.capacity()----返回不重新分配空間可以插入到容器veccont中的元素的最大個數

2). veccont.empty()----容器veccont為空,返回true;否則,返回false

3). veccont.size()----返回容器veccont中當前的個數

4). veccont.max_size()----返回可以插入到容器veccont中的元素的最大個數

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

#include

#include

using namespace std;

int main()

{vectorintlist;

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<::iterator listit;

cout<<"line 30:list elements: ";

for(listit=intlist.begin();listit != intlist.end();++listit)cout<<*lintit<<" ";

cout<

C 中的向量

c 中的標準模板庫 stl,standard template library 有三個主要組成部分 容器 迭代器 演算法 而stl容器可以分為三類 順序容器 關聯容器 容器介面卡 順序容器又有三種預定義的容器 向量 vector 雙端佇列 deque 表 list 向量 訪問向量中的元素。在陣列中間...

c 中 的向量vector

cpp view plain copy print?include include include include 使用向量 就包含向量的標頭檔案 include include using namespace std intmain typedef vector double size type ...

C 中vector向量的基本操作

vector向量是一種簡單高效的容器,具有自動記憶體管理功能。對於大小為n的vector容器,它的元素下標是0 n 1。vector有二個重要方法 begin 返回首元素位置的迭代器。end 返回最後乙個元素的下乙個元素位置的迭代器。1 vector物件建立的幾種方式。1 不指定容器元素個數。vec...