标准库类型 vector 表示对象的集合,其中所有对象的类型都相同。集合中的每个对象都有一个与之对应的索引,所应用于访问对象。因为引用不是对象,所以不包含引用的 vector 。组成 vector 的元素可以是 vector 。
vector 是一个类模板。vector 是模板而非类型,由 vector 生成的类型必须包含 vector 中元素的类型【vector<类型>
】。
头文件
#include<vector>
using std::vector;
定义和初始化 vector 对象
直接初始化的适用情况
- 初始值已知且数量较少
- 初始值是另一个vector对象的副本
- 所有元素的初始值都一样
两个 vector 对象的类型必须相同。
列表初始化 vector 对象
vector<T> v = {a,b,c,...};
特殊要求
- 使用拷贝初始化时(即使用=时),只能提供一个初始值
- 如果提供的是一个类内初始值,只能使用拷贝初始化或使用花括号的形式初始化
- 如果提供的是初始元素值的列表,只能把初始值放在花括号里进行初始化,不能放在圆括号里
指定数量的元素
可用 vector 对象容纳的元素数量和所有元素的统一初始值初始化 vector 对象。
vector<T> v(n,val);
值初始化
可只提供 vector 对象容纳的元素数量而省略初始值,此时库创建一个值初始化的元素初值,并赋给容器中的所有元素,该初值由 vector 对象中元素的类型决定。
若元素是内置类型,如int,元素初始值自动设为0;若元素是某种类类型,如string,则元素由默认初始化。
vector<int> ivec(10);
// 10个元素,每个都初始化为0
vector<string> svec(10);
// 10个元素,每个都是空 string 对象
特殊要求
- 有些类要求必须明确地提供初始值,如果vector对象中元素的类型不支持默认初始化,必须为其提供初始的元素值。对该类型来说,只提供元素的数量不设定初始值无法完成初始化工作。
- 若只提供元素的数量没有设定初始值,只能使用直接初始化。
列表初始值还是元素数量
vector<int> v1(10);
// v1有10个元素,每个元素的值为0
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对象。列表初始化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对象中添加元素
创建一个空vector,在运行时再利用vector的成员函数 push_back 向其中添加元素。push_back 负责把一个值当成 vector 对象的伪元素“压到”vector 对象的“尾端”。若直到运行时才能知道vector对象中元素的确切个数,也可使用该方法。
vector<int> v;
for(int i = 0; i != 100; ++i)
v.push_back(i);
string word;
vector<string> text;
while(cin>>word){
text.push_back(word);
}
vector 对象能高效增长,能在运行时快速地添加元素。虽然如此,但是如果不在定义 vector 对象时设定其大小,性能可能更差(当所有元素的值都一样时例外)。元素的值有所不同时,有效的方法是先定义一个空的 vector 对象,再在运行时向其中添加具体值。
向 vector 对象添加元素蕴含的编程假定
- 必须确保所写的循环正确无误,特别是在循环有可能改变 vector 对象容量的时候。
- 若循环体内部包含有向 vector 对象添加元素的语句,不能使用范围 for 循环。
size
返回 vector 对象中元素的个数,返回值的类型是由 vector 定义的 size_type 类型。
使用 size_type ,需首先指定其是哪种类型定义的,vector 对象的类型总是包含着元素的类型。
vector<int>::size_type
关系运算符、相等运算符
两个 vector 对象相等当且仅当它们所含的元素个数相同,而且对应位置的元素值也相同。
关系元素符依照字典顺序进行比较:如果两个 vector 对象的容量不同,但是在相同位置上的元素值都一样,则元素较少的 vector 对象小于元素较多的 vector 对象;若元素的值有区别,则 vector 对象的大小关系由第一对相异的元素值的大小关系决定。只有当元素的值可能比较时,vector 对象才能被比较【Sales_item 类不支持相等性判断和关系运算等操作,不能比较两个 vector<Sales_item>对象】。
下标
下标从 0 开始记,下标类型是相应的 size_type 类型。
使用下标运算符可以获取到指定的元素。可通过计算得到 vector 内对象的索引,进而直接获取索引位置上的元素。
只要 vector 对象不是一个常量,可以向下标运算符返回的元素赋值。
不能使用下标形式添加元素。当有一个空的 vector 对象时,根本不包含任何元素,就不能通过下标去访问任何元素。
下标运算符可用于访问已存在的元素,不能用于添加元素,且只能对确知已存在的元素执行下标操作。