C 中的vector容器物件學習筆記

2022-10-04 01:48:09 字數 3027 閱讀 4191

c++中陣列很坑,有沒有類似python中list的資料型別呢?類似的就是vector! vector 是同一種型別的物件的集合 ,每個物件都有乙個對應的整數索引值。和 string 物件一樣,標準庫將負責管理與儲存元素相關的記憶體。 我們把 vector 稱為容器,是因為它可以包含其他物件 。 乙個容器中的所有物件都必須是同一種型別的 。

vector物件的定義和初始化

同樣的,使用前,匯入標頭檔案#include 可以使用using宣告:using std::vector;

vector 是乙個類模板(class template)。使用模板可以編寫乙個類定義或函式定義,而用於多個不同的資料型別。因此,我們可以定義儲存 string 物件的 vector,或儲存 int 值的 vector,又或是儲存自定義的類型別物件(如 sales_items 物件)的 vector。

宣告從類模板產生的某種型別的物件,需要提供附加資訊,資訊的種類取決於模板。 以 vector 為例,必須說明 vector 儲存何種物件的型別,通過將型別放在型別放在類模板名稱後面的尖括號中來指定型別:

vector v1;

儲存型別為 t 物件。預設建構函式 v1 為空。

vector v2(v1);

v2 是 v1 的乙個副本。

vector v3(n, i);

v3 包含 n 個值為 i 的元素。

vector v4(n);

v4 含有值初始化的元素的 n 個副本。

【注意:1、若要建立非空的 vector 物件,必須給出初始化元素的值;2、當把乙個 vector 物件複製到另乙個 vector 物件時,新複製的 vector 中每乙個元素都初始化為原 vectors 中相應元素的副本。但這兩個 vector 物件必須儲存同一種元素型別;3、可以用元素個數和元素值對 vector 物件進行初始化。建構函式用元素個數來決定 vector 物件儲存元素的

個數,元素值指定每個元素的初始值】

vector物件動態增長 :

vector 物件(以及其他標準庫容器物件)的重要屬性就在於 可以在執行時高效地新增元素。

【注意:因為

vector 增長的效率高

,在元素值已知的情況下,最好是動態地新增元素。】

值初始化:

如果沒有指定元素的初始化式,那麼標準庫將自行提供乙個元素初始值進行,具體值為何,取決於儲存在vector 中元素的資料型別。

如果為int型資料,那麼標準庫將用 0 值建立元素初始化式;

如果 vector 儲存的是含有建構函式的類型別(如 string)的元素,標準庫將用該型別的預設建構函式建立元素初始化式;

元素型別可能是沒有定義任何建構函式的類型別。這種情況下,標準庫仍產生乙個帶初始值的物件,這個物件的每個成員進行了值初始化。

#include

#include

#include

int main()

注意,沒有=號!

vector物件操作方法

和string類似!

.v.empty()

returns true if v is empty; otherwise returns false如果 v 為空,則返回 true,否則返回 false。

.v.size()

returns number of elements in v返回 v 中元素的個數。

【注意:1、返回相應 vector 類定義的size_type 的值,和string類似。2、使用 size_type 型別時,必須指出該型別是在**定義的。vector 型別總是包括總是

包括 vector 的元素型別 vector::size_type

v.push_back(t)

adds elem with value t to end of v在 v 的末尾增加乙個值為 t 的元素。以下為例子:

#include

#include

#include

#include

int main()

} return word;

}int main()

for(std::vector::size_type ix =0, j = 0; ix != text.size(); ++ix, ++j)

myvec.resize( 102 ); // 用元素的預設建構函式構造了兩個新的元素

myvec[100] = 1; //直接操作新元素

myvec[101] = 2;

初次接觸這兩個介面也許會混淆,其實介面的命名就是對功能的絕佳描述,resize就是重新分配大小,reserve就是預留一定的空間。這兩個介面即存在差別,也有共同點。下面就它們的細節進行分析。

為實現resize的語義,resize介面做了兩個保證:

一是保證區間[0, new_size)範圍內資料有效,如果下標index在此區間內,vector[indext]是合法的。

二是保證區間[0, new_size)範圍以外資料無效,如果下標index在區間外,vector[indext]是非法的。

reserve只是保證vector的空間大小(capacity)最少達到它的引數所指定的大小n。在區間[0, n)範圍內,如果下標是index,vector[index]這種訪問有可能是合法的,也有可能是非法的,視具體情況而定。

resize和reserve介面的共同點是它們都保證了vector的空間大小(capacity)最少達到它的引數所指定的大小。

因兩介面的源**相當精簡,以至於可以在這裡貼上它們:

void resize(size_type new_size)

void resize(size_type new_size, const t& x)

{ if (new_size < size())

erase(begin() + new_size, end()); // erase區間範圍以外的資料,確保區間以外的資料無效

else

insert(end(), new_size - size(), x); // 填補區間範圍內空缺的資料,確保區間內的資料有效

}本文標題: c++中的vector容器物件學習筆記

本文位址:

c 中的vector容器

在c 中,vector是乙個十分有用的容器,下面對這個容器做一下總結。1 基本操作 1 標頭檔案 include.2 建立vector物件,vectorvec 3 尾部插入數字 vec.push back a 4 使用下標訪問元素,cout 5 使用迭代器訪問元素.vector iterator i...

C 中vector容器的用法

1 標頭檔案 include.2 建立vector物件,vector vec 3 尾部插入數字 vec.push back a 4 使用下標訪問元素,cout vector iterator it for it vec.begin it vec.end it cout it 6 插入元素 vec.i...

C 中 vector(容器)的用法

vector 向量 c 中的一種資料結構,確切的說是乙個類.它相當於乙個動態的陣列,當程式設計師無法知道自己需要的陣列的規模多大時,用其來解決問題可以達到最大節約空間的目的.一.用法 1.檔案包含 首先在程式開頭處加上 include以包含所需要的類檔案vector 還有一定要加上using nam...