定義和初始化vector物件

2021-07-04 22:45:50 字數 3460 閱讀 4942

和任何一種類型別一樣,vector模板控制著定義和初始化向量的方法。下面列出了定義vector物件的常用方法。

**預設初始化**vector物件從而建立乙個指定型別的空vector:

vector

svec; //預設初始化,svec不含任何元素

看起來空vector好像沒什麼用,但是很快我們就會知道程式在執行時可以很高效地往vector物件中新增元素。事實上,最常見的方式就是先定義乙個空vector,然後當執行時獲取到元素的值後再逐一新增。

當然也可以在定義vector物件時指定元素的初始值。例如,允許把乙個vector物件的元素拷貝給另外乙個vector物件。此時,新vector物件的元素就是原vector物件對應元素的副本。注意兩個vector物件的型別必須相同:

vector

ivec; // 初始狀態為空

// 在此處給ivec新增一些值

vector

ivec2(ivec); // 把ivec的元素拷貝給 ivec2

vector

ivec3 = ivec; // 把ivec的元素拷貝給 ivec3

vector

svec(ivec2); // 錯誤:svec的元素是string物件,不是int

列表初始化vector物件

c++11新標準還提供了另外一種為vector物件的元素賦初值的方法,即列表初始化。此時,用花括號括起來的0個或多個初始元素值被賦給vector物件:

vector

articles = ;

上述vector物件包含三個元素:第乙個是字串」a」,第二個是字串」an」,最後乙個是字串」the」。

之前已經講過,c++語言提供了幾種不同的初始化方式。在大多數情況下這些初始化方式可以相互等價地使用,不過也並非一直如此。目前已經介紹過的兩種例外情況是:其一,使用拷貝初始化時(即使用=時)只能提供乙個初始值;其二,如果提供的是乙個類內初始值,則只能使用拷貝初始化或使用花括號的形式初始化。第三種特殊的要求是,如果提供的是初始元素值的列表,則只能把初始值都放在花括號裡進行列表初始化,而不能放在圓括號裡:

vector

v1; // 列表初始化

vector

v2("a", "an", "the"); // 錯誤

建立指定數量的元素

用vector物件容納的元素數量和所有元素的統一初始值來初始化vector物件:

vector

ivec(10, -1); // 10個int型別的元素,每個都被初始化為-1

vector

svec(10, "hi!"); // 10個string型別的元素,每個都被初 // 始化為」hi!」

值初始化

通常情況下,可以只提供vector物件容納的元素數量而不用略去初始值。此時庫會建立乙個值初始化的(value-initialized)元素初值,並把它賦給容器中的所有元素。這個初值由vector物件中元素的型別決定。

如果vector物件的元素是內建型別,比如int,則元素初始值自動設為0。如果元素是某種類型別,比如string,則元素由類預設初始化:

vector

ivec(10); // 10個元素,每個都初始化為0

vector

svec(10); // 10個元素,每個都是空string物件

對這種初始化的方式有兩個特殊限制:其一,有些類要求必須明確地提供初始值(參見2.2.1節,第44頁),如果vector物件中元素的型別不支援預設初始化,我們就必須提供初始的元素值。對這種型別的物件來說,只提供元素的數量而不設定初始值無法完成初始化工作。

其二,如果只提供了元素的數量而沒有設定初始值,只能使用直接初始化:

vector

vi = 10; // 錯誤:必須使用直接初始化的形式指定向量大小

這裡的10是用來說明如何初始化vector物件的,我們用它的本意是想建立含有10個值初始化了的元素的vector物件,而非把數字10「拷貝」到vector中。因此,此時不宜使用拷貝初始化,將對這一點做更詳細的介紹。

列表初始值還是元素數量?

在某些情況下,初始化的真實含義依賴於傳遞初始值時用的是花括號還是圓括號。例如,用乙個整數來初始化vector時,整數的含義可能是vector物件的容量也可能是元素的值。類似的,用兩個整數來初始化vector時,這兩個整數可能乙個是vector物件的容量,另乙個是元素的初值,也可能它們是容量為2的vector物件中兩個元素的初值。通過使用花括號或圓括號可以區分上述這些含義:

vector

v1(10); // v1有10個元素,每個的值都是0

vector

v2; // v2有1個元素,該元素的值是10

vector

v3(10, 1); // v3有10個元素,每個的值都是1

vector

v4; // v4有2個元素,值分別是10和1

如果用的是圓括號,可以說提供的值是用來構造(construct)vector物件的。例如,v1的初始值說明了vector物件的容量;v3的兩個初始值則分別說明了vector物件的容量和元素的初值。

如果用的是花括號,可以表述成我們想列表初始化(list initialize)該vector物件。也就是說,初始化過程會盡可能地把花括號內的值當成是元素初始值的列表來處理,只有在無法執行列表初始化時才會考慮其他初始化方式。在上例中,給v2和v4提供的初始值都能作為元素的值,所以它們都會執行列表初始化,vector物件v2包含乙個元素而vector物件v4包含兩個元素。

另一方面,如果初始化時使用了花括號的形式但是提供的值又不能用來列表初始化,就要考慮用這樣的值來構造vector物件了。例如,要想列表初始化乙個含有string物件的vector物件,應該提供能賦給string物件的初值。此時不難區分到底是要列表初始化vector物件的元素還是用給定的容量值來構造vector物件:

vector

v5; // 列表初始化:v5有乙個元素

vector

v6("hi"); // 錯誤:不能使用字串字面值構建vector物件

vector

v7; // v7有10個預設初始化的元素

vector

v8; // v8有10個值為"hi"的元素

儘管在上面的例子中除了第二條語句之外都用了花括號,但其實只有v5是列表初始化。要想列表初始化vector物件,花括號裡的值必須與元素型別相同。顯然不能用int初始化string物件,所以v7和v8提供的值不能作為元素的初始值。確認無法執行列表初始化後,編譯器會嘗試用預設值初始化vector物件。

vector物件的初始化

1 標準庫型別vector表示物件的集合,其中所有物件的型別必須相同。因為vector容納著 容納著 其他物件,所以也常被稱作容器。2 想要使用vector必須包含適當的標頭檔案。include using std vector 其定義在命名空間std中 3 vector是乙個類模板。當使用模板例項...

vector(一) 定義和初始化

基於 c primer p87 標準庫型別 vector 表示物件的集合,其中所有物件的型別都相同。使用 vector 必須包含適當的標頭檔案。vector 是類模版而非型別,模版可以看作為編譯器生成類或函式編寫的乙份說明,編譯器根據模版建立類或函式的過程成為例項化。由於引用不是物件,因此不存在包含...

vector 多維向量定義及其初始化

using namespace std 一維向量 vector vector 1d 1 只定義向量 vector vector 1d 2 n 定義的同時初始化大小 vector vector 1d 3 n,m 定義的同時初始化大小為n,元素初始值為m vector vector 1d 4 vecto...