开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情
vector
表示对象的集合,其中所有对象的类型都是相同的。每个对象都有索引,通过索引访问对象
include <vector> //包含vector头文件
using std::vector; //使用std命名空间
使用类模版指定vector
对象的类型
vector
能容纳绝大多数类型的对象作为其元素
- 引用不是对象,所以不可以存引用
- 大多数内置类型和类类型都可以存储
初始化vector对象
vector<T> v1; //v1是空vector,存放的元素类型为T,执行默认初始化
vector<T> v2(v1); //v2包含所有v1元素的副本
vector<T> v2 = v1; //和上述等价
vector<T> v3(n,val); //v3包含n个重复的val元素
vector<T> v4(n); //v4包含n个执行了值初始化的对象,每个值的初始值由T的类型决定
vector<T> v5{a,b,c,...}; //v5包含了多个有初始值的元素
vector<T> v5 = {a,b,c,...}; //和上述等价
使用圆括号和花括号区分初始值的真正含义
- 使用的是圆括号,提供的值是用来构造
vector
对象 - 使用的是花括号,就是用列表初始化
vector
对象
但是如果使用了花括号,但是初始值又和vector
包含的类型不匹配,那就可能是在使用圆括号的规则
vector<string> v6{10}; //v6有10个默认初始化的元素
vector<string> v7{10,"hi"}; //v7有10个值为"hi"的元素
//但是尽量避免这样用吧,造成代码理解困难
初始化方式区别延伸
- 除了
string
中介绍的直接初始化和拷贝初始化的区别
- 如果提供的是初始元素列表,就只能把初始值放在花括号里进行初始化,如上述v5的初始化
vector
操作方法
-
添加元素
一般比较常用的初始化方法是默认空数据初始化,之后动态的向
vector
中添加元素使用
push_back()
函数,向vector
尾部添加元素vector<int> v2; for (int i = 0; i < 100; ++i) { //添加元素 v2.push_back(i); }
注意:
- 如果循环体内部包含有向
vector
对象添加元素的语句,则不能使用范围for
循环 范围for
语句体内不应改变其所遍历序列的大小
- 如果循环体内部包含有向
-
访问元素的方式和
string
访问字符方法类似,都是通过下标索引到对象vector
的索引下标是从0到size() -1
-
不能通过下标的形式添加元素,这是错误的
vector<int> ivec; //空vector ivec[0] = 1; //错误,ivec不包含任何元素,不存在index=0的元素
-
如果访问的下标超过了
vector
的范围,会产生无法预期的问题因此如果确认下标合法,就可以使用
for
或者下标访问 如果不确定,应该使用迭代器访问
-
empty
和size
- 也是和
string
同名函数功能相同
size()
返回的类型是vector<T>::size_type
,必须包含着元素类型
- 也是和
-
相等性性判断也和
string
功能一致但是需要比较时,那么
vector
中的元素必须有可以做比较的函数,不然不能比较两个vector