定义和初始化vector对象
定义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对象。