C++ vector::保留和内置类型

C++ vector::保留和内置类型,c++,vector,C++,Vector,如果没有完整阅读,请不要将此标记为重复。这不是一个“std::reserve做什么”的问题 使用内置类型写入vector::reserve'd地址是错误的吗 vector<int> vec; vec.reserve(10); vec[5] = 24; // Is this an error? vec; 车辆储备(10); vec[5]=24;//这是一个错误吗? 我知道对象没有初始化,但因为它们只是整数,空间是由保留区分配的,这是在连续存储中完成的,这是一个错误吗?是的,这是一个

如果没有完整阅读,请不要将此标记为重复。这不是一个“std::reserve做什么”的问题

使用内置类型写入vector::reserve'd地址是错误的吗

vector<int> vec;
vec.reserve(10);
vec[5] = 24; // Is this an error?
vec;
车辆储备(10);
vec[5]=24;//这是一个错误吗?
我知道对象没有初始化,但因为它们只是整数,空间是由保留区分配的,这是在连续存储中完成的,这是一个错误吗?

是的,这是一个错误

这也是
vector::reserve
vector::resize
之间的区别。正如你们所说的,它必须和向量元素统一起来


关于两者之间的差异,请参阅优秀线程。根据标准,这是一个错误,因为它是未定义的行为。这可能不会导致任何明显的问题,但仍然是一个错误。一些实现将执行边界检查,并在调试模式下引发异常。他们可以这样做,这样做完全符合标准,因为您调用了未定义的行为。

所谓“对象”是指向量本身,对吗?是的,向量没有初始化。即使是,但当前大小为5,保留空间为20,执行vec[10]也会产生错误。@therainmaker:不,向量不是未初始化的,元素是。@BenjaminLindley:很好的区别。我从来没有这样想过。编辑它。@therainmaker:即使有这个警告,它也没有真正说到点子上,因为我们在这里讨论的是豆荚类型。分配给POD类型就等于初始化它们。因此,如果唯一的问题是
reserve
没有初始化元素,那么OP所做的对于POD类型的向量(如int)来说不会是错误的。另请参见:这实际上是“what does
std::reserve
所做的”。如果你明白这一点,你就不会问这个问题。@juanchopanza我不在乎落选票。特别是因为下面的答案都是错误的——这意味着人们没有明确的概念,因此这是一个完全正确的问题。我找不到一个能准确回答我问题的副本。在我看来,这是一个完全合理的问题。我相信下层选民并没有真正理解这一点。@sbabbi这是合法的,以前也有人问过。包括之前的OP,这是有道理的。毕竟尺寸没有改变。