第3章 3.3 标准库类型vector

第3章 3.3 标准库类型vector


​ 标准库类型 vector 表示对象的集合,其中所有对象的类型都相同。集合中的每个元素都有一个与之对应的索引,索引用于访问对象。由于vector”容纳着“其它对象,所以vector也被称为 容器

​ 如果要使用vector,必须包含如下代码:

#include <vector>
using std::vector;

【类模板】

​ C++语言中既有 类模板 又有 函数模板,其中 vector是一个类模板

​ 模板本身不是类或函数,编译器根据模板来创建类或函数(该过程称为 实例化)。当使用模板时,需要指出编译器应把类或函数实例化成何种类型

​ 对于类模板来说,需要提供一些额外信息来指定模板到底实例化成什么,而需要提供哪些信息则由模板决定。提供信息的方式总是这样:在模板名字后跟一对尖括号,在括号内放上信息。以vector为例,提供的额外信息是vector内存放对象的类型:

vector<int>a;  // a保存int类型的对象
vector<vector<int>>b; b保存的元素类型是vector对象

【注意】vector能容纳绝大多数类型的对象作为其元素,但是因为引用不是对象,所以不存在包含引用的vector。

3.3.1 定义和初始化vector对象

​ vector模板控制着定义和初始化向量的方法。定义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> v5{a, b, c...}  v5包含了初始值个数的元素,每个元素被赋予对应的初始值
vector<T> v5={a, b, c...} 等价于v5{a, b, c...}

【注意】在对vector进行初始化时,如果采用列表初始化,则初始值只能放到花括号里,而不能放到圆括号里。

​ 另外,通常情况下,可以 只提供vector对象容纳的元素数量,而略去初始值,此时标准库会创建一个 值初始化的 元素初值,并把它赋给容器中的所有元素,这个初值由vector对象中元素的类型决定,例如:

vector<int>a(10);  // a有10个元素,每个元素初始化为0
vector<string>b(20); // b中有20个元素,每个都是空string对象
【列表初始值还是元素数量?】

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

(1)用一个整数来初始化 vector 时,整数的含义可能是:

​ A. vector对象的容量;

​ B. vector对象中元素的值。

(2)用两个整数来初始化vector 时,这两个整数可能是:

​ A. 一个是vector对象的容量,另一个是元素的初值;

​ B. 它们是容量为2的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

【注意】

(1)如果使用的是 圆括号,可以说提供的值是用来 构造 vector 对象的;

(2)如果使用的是 花括号,则表示想使用 列表初始化 该 vector 对象,那么初始化过程会尽可能将花括号内的值当成元素初始值的列表来处理,只有在无法执行列表初始化时才考虑其它方式

(3)如果初始化时采用了 花括号 的方式,但 提供的值又不能用来列表初始化,则要考虑用这样的值来 构造vector 对象 了。例如:

vector<string> v1{"hi"}; // 列表初始化:v有1个元素
vector<string> v2("hi"); // 错误:初始值只能放到花括号中
vector<string> v3{10}; // v3有10个默认初始化的元素
vector<stirng> v4{10, "hi"}; // v4有10个值为"hi"的元素

3.3.2 vector操作

【添加元素】

​ 如果要向 vector 中添加元素,需要使用 push_back函数。push_back 函数负责把一个值当成 vector 对象的尾元素“压到”vector对象的“尾端”,例如:

vector<int>a; // a是空的vector对象
for(int i=0; i<10; ++i) {
    a.push_back(i);   
}
【访问vector对象中的元素】

​ 要访问vector对象中的元素,可以使用范围for语句,例如:

vector<int> a{1, 2, 3, 4};
for(auto &j : a) {
    j = j * 2;
}

for(auto i : a) {
    cout << i << endl;   
}
【empty和size函数】

empty 函数用于检查vector对象是否包含元素,然后返回一个布尔值;

size 函数返回vector对象中元素的个数,返回值的类型是由vector定义的 size_type 类型。

【注意】使用 size_type时,需要先指定它是由哪种类型定义的。vector对象的类型总是包含着元素的类型。例如:

vector<int>::size_type  // 正确
vector::size_type // 错误
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值