標準庫 vector 類型

標準庫 vector 類型

vector 不是一種數據類型,而只是一個類模板(class template),可用來定義任意多種數據類型。vector 類型的每一種都指定了其保存元素的類型。因此,vector 和 vector 都是數據類型。

初始化vector

這裏寫圖片描述

值初始化

如果沒有指定元素的初始化式,那麼標準庫將自行提供一個元素初始值進行值初始化(value initializationd)。這個由庫生成的初始值將用來初始化容器中的每個元素,具體值爲何,取決於存儲在 vector 中元素的數據類型。
如果 vector 保存內置類型(如 int 類型)的元素,那麼標準庫將用 0 值
創建元素初始化式:
vector fvec(10); // 10 elements, each initialized to 0
如果 vector 保存的是含有構造函數的類類型(如 string)的元素,標準
庫將用該類型的默認構造函數創建元素初始化式:
vector svec(10); // 10 elements, each an empty string
還有第三種可能性:元素類型可能是沒有定義任何構造函數的類類型。這種情況下,標準庫仍產生一個帶初始值的對象,這個對象的每個成員進行了值初始化。

用數組初始化vector

const size_t arr_size = 6;
int int_arr[arr_size] = {0, 1, 2, 3, 4, 5};
// ivec has 6 elements: each a copy of the corresponding element
in int_arr
vector<int> ivec(int_arr, int_arr + arr_size);

vector常用操作

這裏寫圖片描述

安全的泛型編程

for (vector<int>::size_type ix = 0; ix != 10; ++ix)
    ivec.push_back(ix); // ok: adds new element with value ix

調用 size 成員函數而不保存它返回的值,在這個例子中同樣不是必需的,但這反映了一種良好的編程習慣。在 C++ 中,有些數據結構(如vector)可以動態增長。上例中循環僅需要讀取元素,而不需要增加新的元素。但是,循環可以容易地增加新元素,如果確實增加了新元素的話,那麼測試已保存的 size 值作爲循環的結束條件就會有問題,因爲沒有將新加入的元素計算在內。所以我們傾向於在每次循環中測試 size的當前值,而不是在進入循環前,存儲 size 值的副本。
我們將在第七章學習到,C++ 中有些函數可以聲明爲內聯(inline)函數。編譯器遇到內聯函數時就會直接擴展相應代碼,而不是進行實際的函數調用。像 size 這樣的小庫函數幾乎都定義爲內聯函數,所以每次循環過程中調用它的運行時代價是比較小的。

迭代器簡介

標準庫爲每一種標準容器(包括 vector)定義了一種迭代器類型。迭代器類型提供了比下標操作更通用化的方法:所有的標準庫容器都定義了相應的迭代器類型,而只有少數的容器支持下標操作。

vector 迭代器的自增和解引用運算

迭代器類型可使用解引用操作符(dereference operator)(*)來訪問迭代器所指向的元素:
*iter = 0;
迭代器使用自增操作符(1.4.1 節)向前移動迭代器指向容器中下一個元素。
由於 end 操作返回的迭代器不指向任何元素,因此不能對它進行解引用或自增操作。

const_iterator

每種容器類型還定義了一種名爲 const_iterator 的類型,該類型只能用於讀取容器內元素,但不能改變其值。
當我們對普通 iterator 類型解引用時,得到對某個元素的非 const(2.5 節)。而如果我們對 const_iterator 類型解引用時,則可以得到一個指向 const 對象的引用(2.4 節),如同任何常量一樣,該對象不能進行重寫。
使用 const_iterator 類型時,我們可以得到一個迭代器,它自身的值可以改變,但不能用來改變其所指向的元素的值。可以對迭代器進行自增以及使用解引用操作符來讀取值,但不能對該元素賦值。

迭代器的算術操作

迭代器算術操作
(iterator arithmetic),包括:
• iter + n
• iter - n
加上或減去的值的類型應該是 vector 的 size_type 或 difference_type 類型(參考下面的解釋)。
• iter1 - iter2
該表達式用來計算兩個迭代器對象的距離,該距離是名爲 difference_type 的 signed 類型 size_type 的值,這裏的 difference_type 是 signed 類型,因爲減法運算可能產生負數的結果。該類型可以保證足夠大以存儲任何兩個迭代器對象間的距離。

任何改變 vector 長度的操作都會使已存在的迭代器失效。例如,在調用 push_back 之後,就不能再信賴指向 vector 的迭代器的值了。

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