据我所知,可以通过两种方式将元素分配给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
所以有人可以解释:
为什么即使在插入
'a'
?
之后,尺寸为0为什么
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'
之前,将矢量留下两个。
- 您没有插入它,而是分配给了一个不存在的元素。这具有不确定的行为。分配不会扩展向量。
- 由于向量是空的,因此
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