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

Jam*_*rts 0 c++ vector

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

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;
}
Run Code Online (Sandbox Code Playgroud)

该程序的输出为:

Size after inserting a: 0
Size after inserting b: 1
Contents: b
Run Code Online (Sandbox Code Playgroud)

所以有人可以解释一下:

  1. 为什么即使插入后大小仍为0 'a'

  2. 为什么要things.push_back('b')覆盖'a'

注意:unsigned char之所以使用,是因为我已经从正在编写的涉及操纵该类型的程序中改编了这段代码。

提前致谢。

Bla*_*aze 7

reserve实际上并没有改变向量的大小。它只会更改向量的容量-与其实际大小不同(请参阅此处以了解其实际含义)。因此您的调用things[0] = 'a';超出了向量的大小,因为它的大小仍然为0,因此行为未定义。

如果您resize改为致电,则会收到以下消息:

Size after inserting a: 2
Size after inserting b: 3
Contents: a
Run Code Online (Sandbox Code Playgroud)

现在向量包含a 'a',a '\0'和a 'b'。该'\0'是有,因为这是默认值unsigned char,所以things.resize(2);叶两你们以前的矢量改变一个到'a'


mol*_*ilo 5

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