定義vector對象的常用方法:
初始化vector對象的方法 | |
vector<T> v1 | v1是一個空vector,它潛在的元素是T類型,執行默認初始化 |
vector<T> v2(v1) | v2中包含v1所有元素的副本 |
vector<T> v3(n,val) | v3包含了n個重復的元素,每個元素的值都是val |
vector<T> v4(n) | v4包含了n個重復地執行了值初始化的對象 |
vector<T> v5{a,b,c...} | v5包含了初始值個數的元素,每個元素被賦予相應的初始值 |
vector<T> v5={a,b,c...} | 等價於vector<T> v5{a,b,c...} |
默認初始化vector對象,創建一個指定類型空vector:
vector<string> svec;//默認初始化,svec不含任何元素
允許把一個vector對象的元素拷貝給另外一個vector對象:
vector<int> ivec;//初始狀態為空 vector<int> ivec2(ivec);//把ivec的元素拷貝給ivec2 vector<int> ivec3 = ivec;//把ivec的元素拷貝給ivec3 vector<string> svec(ivec2);//錯誤:sevc的元素是string對象,不是int
列表初始化vector對象
列表初始化,用花括號括起來的0個或多個初始值被賦予給vector對象:
vector<string> articles = {"a","an","the"};
提供的是初始元素值的列表,只能把初始值都放在花括號里進行列表初始化,而不能放在圓括號里:
vector<string> v1 = { "a","an","the" };//列表初始化 vector<string> v2=("a","an","the");//錯誤
創建指定數量的元素
vector對象容納的元素數量和所有元素的統一初始值來初始化vector對象:
vector<int> ivec(10,-1);//10個int類型的元素,每個都被初始化為-1 vector<string> svec(10, "hi");//10個string類型的元素,每個都被初始化為"hi!"
值初始化
只提供vector對象容納的元素數量而略去初始值,庫會創建一個值初始化的元素初值,並把它賦給容器中的所有元素,初值由vector對象中元素的類型決定:
vector<int> ivec(10);//10個元素,每個都初始化為0 vector<string> svec(10);//10個元素,每個都是空string對象
特殊限制:
- 如果vector中元素的類型不支持默認初始化,就必須提供初始的元素值。
- 如果只提供了元素的數量而沒有設定初始值,只能使用直接初始化:
vector<int> vi = 10;//錯誤:必須使用直接初始化的形式指定向量大小
本意是想創建含有10個值初始化了的元素的vector對象,而非把數字10“拷貝”到vector中,此時不宜使用拷貝初始化。
列表初始值還是元素數量?
vector<int> v1(10);//v1有10個元素,每個的值都是10 vector<int> v2{ 10 };//v2有1個元素,該元素的值是10 vector<int> v3(10, 1);//v3有10個元素,每個元素的值都是1 vector<int> v4{ 10,1 };//v4有2個元素,值分別是10和1
- 如果用的是圓括號,提供的值是用來構造vector對象的。
- 如果用的是花括號,列表初始化vector對象。初始化過程會盡可能把花括號內的值當成是元素初始值的列表來處理,只有在無法執行列表初始化時才會考慮其他初始化方式:
vector<string> v5{"hi"};//列表初始化:v5有一個元素 vector<string> v6("hi");//錯誤:不能使用字符串字面值構建vector對象 vector<string> v7{ 10 };//v7有10個默認初始化的元素 vector<string> v8{ 10,"hi" };//v8有10個值為"hi"的元素
要想列表初始化vector對象,花括號里的值必須與元素類型相同,確認無法執行列表初始化后,編譯器會嘗試用默認初始化vector對象。