标准库类型vector表示对象的集合,其中所有对象的类型都相同。集合中的每个对象都有一个与之对应的索引,索引用于访问对象。
不包含引用的vector
3.3.1 定义和初始化vector对象
vector<T> v1 | v1是一个空vector,它潜在的元素是T类型,默认初始化 | 默认初始化 |
vector<T> v2(v1) | v2中包含v1所有元素的副本 | 直接初始化 |
vector<T> v2=v1 | 等价于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,...} | 等价于v5{a,b,c,...} | 列表初始化{} |
- 最常用的方式:定义一个空vector,然后当运行时获取到元素的值后再逐一添加
- 允许把一个vector对象的元素拷贝给另外一个vector对象,新vector对象的元素是原vector对象对应元素的副本,!!!两个vector对象的类型必须相同:
vector <int> ivec; ✔//初始状态是空
vector<int> ivec2(ivec); ✔ //把ivec的元素拷贝给ivec2
vector<int> ivec3=ivec; ✔ //把ivec的元素拷贝给ivec3
vector<string> svec(ivec2); ×//错误:svec的元素是string对象,不是int
- 列表初始化vector对象:初始元素值的列表只能把初始值放在花括号里进行初始化,而不能放在圆括号里
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<int> vi=10; ×//错误:必须使用直接初始化的形式指定向量的大小
- 列表初始值还是元素数量?
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 <string> v5{"hi"}; //初始化列表:v5有一个元素
vector<string> v6("hi"); //× ,错误:不能使用字符串字面值构建vector对象
vector<string> v7{10}; //v7有10个默认初始化的元素
vector<string> v8{10,"hi"}; //v8有10个值为“hi”的元素
(1)圆括号:可用来构造vector对象,如v1的初始值说明了vector对象的容量;v3的两个初始值分别说吗vector对象的容量和元素的初值。
(2)花括号:一般把花括号的值当成元素初始值的列表,如v2、 v4、v5,想要列表初始化vector对象,花括号里的值必须与元素类型相同。当花括号内提供的值不能用来列表初始化时,则该值用来构造vector对象。如v7和v8。
3.3.2向vector对象中添加元素
- 直接初始化适用于三种情况:
(1)初始值已知且数量较少
(2)初始值是另一个vector的副本
(3)所有元素的初始值都一样
- 问题:
(1)创建vector对象时并不清楚实际所需的元素个数,元素的值也经常无法确定;
(2)即使元素初值已知,但如果这些值总量较大而各不相同,那么在创建vector对象的时候执行初始化操作过于繁琐。
- 解决方法:
(1)先创建一个空vector
(2) 在运行时利用vector的成员函数push_back向其中添加元素 .[push_back:负责把一个值当成vector对象的尾元素“压到push”vector对象的“尾端back” ]
eg1: 元素初值已知,但如果这些值总量较大而各不相同
vector<int> v2; //空 vector对象
for(int i=0;i!=100;i++)
v2.push_back(i); //依次把整数值放到v2尾端
eg2:直到运行时才知道vector对象中元素的确切个数。有时需要实时读入数据然后将其赋值vector对象
//从标准输入中读取单词,将其作为vector对象的元素存储
string word;
vector(string) text; //空vector对象
while(cin>>word){
text.push_back(word); //把word添加到text后面
}
3.3.3 其他vector操作
v.empty() | 如果v不含有任何元素,返回真,否则返回假 |
v.size() | 返回v中元素的个数 |
v[n] | 返回v中第n个位置上元素的引用 |
v1=v2 | 用v2中元素的拷贝替换v1中的元素 |
v1={a,b,c,...} | 用列表中元素的拷贝替换v1中的元素 |
v1==v2 | v1和v2相等当且仅当它们的元素数量相同且对应位置的元素值都相同 |
v1!=v2 | |
<,<=,>,>= | 以字典顺序比较 |
- 访问vector对象中元素的方法:通过元素在vector对象中的位置
- 要使用size_type,需要首先指定它是由哪种类型定义的。vector对象的类型总是包含着元素的类型。
- 计算vector内对象的索引:vector对象的下标从0开始,下标的类型是相应的size_type类型。只要vector对象不是一个常量,就能向下标运算符返回的元素赋值。
- 不能用下标形式添加元素。vector对象的下标运算符可用于访问已存在的元素,而不能用于添加元素。