C++Primer第3章(3)标准库类型vector

3.3 标准库类型vector

​ 标准库类型vector表示对象的集合,其中所有对象的类型都相同.集合中的每个对象都有一个与之对应的索引,索引用于访问对象.

​ 使用vector需要包含适当的头文件

#include<vector>
using std::vector;

​ vector是一个类模板.模板本身不是类或函数,可以将它看作为编译器生成类或函数编写的一份说明.编译器根据模板创建类或函数的过程称为实例化,使用模板时,需要指出编译器应该把类或函数实例化成何种类型.

​ 对于类模板,我们可以在模板名字后面跟一对尖括号,括号内放上信息,通过这些信息指定模板实例化成某种类.

vector<int> ivec;				//ivec保存int类型的对象
vector<vector<string>> file;  //该向量的元素是vector对象

​ vector能容纳绝大多数类型的对象作为其元素,但是因为引用不是对象,索引不存在包含引用的vector.

​ 在早期版本c++标准中,如果vector的元素还是vector,必须在外侧vector对象的右尖括号和其元素类型之间加一个空格.

vector<vector<string> > file;
vector<vector<string>> file;     //错误

image-20211130093604681

3.3.1 定义和初始化vector对象

image-20211130093707673

​ 可以把一个vector对象的元素拷贝给另外一个vector对象,但连个vector对象的类型必须相同.

image-20211130094401854

值初始化

​ 可以只提供vector对象容纳的元素数量,此时库会创建一个值初始化的元素初值,并把它赋给容器中的所有元素.这个初值由vector对象中元素的类型决定.

vector<int> ivec(10);	//10个元素,每个都初始化为0
vector<string> svec(10);//10个元素,每个都是空string对象

使用这种方式初始化有两条限制:

  • 如果vector对象中元素的类型不支持默认初始化,我们就必须提供初始的元素值.
  • 如果只提供了元素的数量而没有设定初始值,只能使用直接初始化
vector<int> vi = 10;  //错误,必须使用直接初始化的形式指定向量大小

列表初始值还是元素数量

​ 在某些情况下,初始化的真实含义依赖于传递初始值时用的是花括号还是圆括号.

vector<int> v1(10);  //v1有10个元素,每个的值都是0
vector<int> v2{10};	 //v2有一个元素,值为10

vector<int> v3(10,1);//v3有十个元素,每个的值为1
vector<int> v4{10,1};//v4有2个元素,分别为10和1

3.3.2 向vector对象中添加元素

​ 可以使用vector的成员函数push_back向其中添加元素.push_back负责把一个值当成vector对象的尾元素压到vector对象的尾端.

vector<int> v2;
for(int i = 0; i != 100; ++i)
	v2.push_back(i);
//循环结束后v2有100个元素,值从0到99

​ 在上述代码中,虽然事先知道vector对象最后会包含100个元素,但在一开始还是把它声明成空vector,在每次迭代时才顺序地把下一个整数作为v2的新元素添加给它.

​ 如果直到运行时才能知道vector对象中元素的个数,也用上述方法为其赋值.

image-20211130103810672

向vector对象添加元素蕴含的编程假定

​ 由于能高效便捷地向vector对象中添加元素,很多编程工作被极大简化了。然而,这种简便性也伴随着一些对编写程序更高的要求:其中一条就是必须要确保所写的循环正确无误,特别是在循环有可能改变vector对象容量的时候

如果循环体内部包含有向vector对象添加元素的语句,则不能使用范围for循环

3.3.3 其他vector操作

image-20211130104730933

​ vector的empty函数检查vector对象是否包含元素然后返回一个布尔值;size则返回vector对象中元素的个数,返回值的类型是由vector定义的size_type类型

image-20211130110716818

只有当元素的值可比较时,vector对象才能被比较

两个vector对象相等当且仅当它们所含的元素个数相同,而且对应位置的元素值也相同。关系运算符依照字典顺序进行比较:如果两个vector对象的容量不同,但是在相同位置上的元素值都一样,则元素较少的vector对象小于元素较多的vector对象;若元素的值有区别,则vector对象的大小关系由第一对相异的元素值的大小关系决定。

计算vector内对象的索引

​ 使用下标运算符能获取到指定的元素。和 string一样,vector对象的下标也是从0开始计起,下标的类型是相应的size_type类型。只要vector对象不是一个常量,就能向下标运算符返回的元素赋值。

不能用下标形式添加元素

vector<int> ivec;
for(decltype(ivec.size()) ix = 0; ix != 10; ++ix)
	ivec[ix] = ix; //严重错误:ivec不包含任何元素

​ 上述代码试图为vector对象ivec添加10个元素.然而,这段代码是错误的,ivec是一个空的vector,不包含任何元素,所以就不能通过下标去访问任何元素.

image-20211130122545230
image-20211130122558642

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

远离蒙昧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值