分配std :: vector元素的两种方法

Two ways to assign elements of std::vector

本文关键字:两种 方法 vector std 分配 元素      更新时间:2023-10-16

据我所知,可以通过两种方式将元素分配给std::vector

vec[i] = value

vec.push_back(value)

但是,第一种方法似乎对vec.size()没有影响,并且也被随后呼叫vec.push_back()覆盖。一个最小的例子要证明:

#include <iostream>
#include <vector>
int main()
{
    std::vector<unsigned char> things;
    things.reserve(2);
    things[0] = 'a';
    std::cout << "Size after inserting a: ";
    std::cout << things.size() << std::endl;
    things.push_back('b');
    std::cout << "Size after inserting b: ";
    std::cout << things.size() << std::endl;
    std::cout << "Contents: ";
    for (int i=0; i<2; i++)
    {
        std::cout << things[i] << std::endl;
    }
    return 0;
}

该程序的输出是:

Size after inserting a: 0
Size after inserting b: 1
Contents: b

所以有人可以解释:

  1. 为什么即使在插入'a'

  2. 之后,尺寸为0
  3. 为什么things.push_back('b')覆盖'a'

注意:我正在使用unsigned char,因为我已经从正在编写的程序中调整了该代码,该程序涉及操纵这种类型。

预先感谢。

reserve实际上并未更改向量的大小。它只会改变向量的能力 - 这与实际尺寸不同(有关其实际是什么的说明,请参见此处(。因此,您对things[0] = 'a';的调用已经超过了向量的大小,因为它仍然具有0尺寸,因此不确定。

如果您致电resize,则得到此:

Size after inserting a: 2
Size after inserting b: 3
Contents: a

现在,向量包含一个'a',A '''b'''之所以存在,是因为那是unsigned char的默认值,因此things.resize(2);在将一个将一个更改为 'a'之前,将矢量留下两个。

  1. 您没有插入它,而是分配给了一个不存在的元素。这具有不确定的行为。分配不会扩展向量。
  2. 由于向量是空的,因此push_back添加了第一个元素。

一个更多信息

std::vector<unsigned char> things;
things.reserve(2);

在下面的分配下,未经检查向量的边界,它将写入事物[0]指向的内存。此操作永远不会失败,但由于内存损坏而导致不确定的行为。

things[0]    = 'a';  // 1

下面的分配检查向量的范围,然后写入事物[0]指向的内存。如果索引不在向量范围内并投掷std :: out_of_range'异常。

,它将失败。
things.at(0) = 'a'   //2