CPP基础--标准库类型vector

作者 by adtxl / 2021-03-08 / 暂无评论 / 404 个足迹

标准库类型vector

标准库类型vector表示对象的集合,其中所有对象的类型都相同。集合中每个对象都有一个与之对应的索引,索引用于访问对象。因为vector"容纳着"其他对象,所以也常被乘做容器(container)。

vector是模板而非类型,由vector生成的类型必须包含vector中元素的类型,例如vector<int>
vector能容纳绝大多数类型的对象作为其元素,但是因为引用不是对象,所以不存在包含引用的vector。

1. 定义和初始化vector对象

和任何一种类类型一样,vector模板控制着定义和初始化向量的方法。
image.png

  • 列表初始化vector对象

用花括号括起来的0个或多个初始元素值被赋给vector对象:

vector<string> articles = {"a", "an", "the"};
  • 创建指定数量的元素

还可以用vector对象容纳的元素数量和所有元素的统一初始值来初始化vector对象:

vector<int> ivec(10, -1);
vector<string> svec(10, "hi");
  • 值初始化

通常情况下,可以只提供给vector对象容纳的元素数量而不用略去初始值。此时库会创建一个值初始化的(value-initialized)元素初值,并把它赋给容器中的所有元素。这个初值由vector对象中元素的类型决定。

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

对这种初始化的方式有两个特殊限制:其一,有些类要求必须明确地提供初始值,如果vector对象中元素的类型不支持默认初始化,我们就必须提供初始的元素值。对这种类型的对象来说,只提供元素的数量而不设定初始值无法完成初始化工作。

  • 列表初始值还是元素数量

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

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

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

如果用的是圆括号,可以说提供的值是用来构造(construct)vector对象的。
如果用的是花括号,可以表述成我们想列表初始化该vector对象。

另一方面,如果初始化时用了花括号的形式但是提供的值又不能用来列表初始化,就要考虑用这样的值来构造vector对象了。

vector<string> v5{"hi"};
vector<string> v6("hi");        // error:不能使用字符串字面值构建vector对象
vector<string> v7{10};          // v7有10个默认初始化的元素
vector<string> v8{10, "hi"};    // v8有10个值为"hi"的元素

2. 向vector对象添加元素

经常使用vector的情况是并不清楚实际所需的元素个数,元素的值也经常无法确定。还有些时候即使元素的初值已知,但如果这些值总量较大而各不相同,那么在创建vector对象的时候执行初始化操作也会显得过于繁琐。
我们可以利用vector成员函数push_back()向其中添加元素

vector<int> v1;
for (int i = 0; i < 100; i++)
{
    v1.push_back(i);
}
  • 向vector对象添加元素蕴含的编程假定
  1. 必须要确保缩写的循环正确无误,特别是在循环有可能改变vector对象容量的时候
  2. 如果循环体内部包含有向vector对象添加元素的语句,则不能使用范围for循环。范围for语句体内不应改变其所遍历序列的大小。

3. 其它vector操作

除了push_back之外,vector还提供了几种其他操作,大多数都和string的相关操作类似
imagefefc2406d635ecb4.png

  • 计算vector内对象的索引

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

  • 不能使用下标形式添加元素

vector对象(以及string对象)的下标运算符可用于访问已存在的元素,而不能用于添加元素。
关于下标必须明确的一点是:只能对确知已存在的元素执行下标操作。

独特见解