我有一个std::vector
,我称之为reserve
具有较大的值。之后我检索data()
。
因为迭代data
然后崩溃,我想知道这是否被允许。reserve
是否强制更新data
到已分配的内存范围?
reserve
保证后续插入不会重新分配,因此不会导致无效。就是这样。没有进一步的保证。
是否强制
reserve
将data
更新到已分配的内存范围?
。标准只保证std::vector::data
返回一个指针,[data(), data() + size())
是一个有效范围,capacity
不涉及。
§23.3.11.4/1向量数据[vector.data]:
返回:一个指针,使得
[data(), data() + size())
是有效的的范围内。对于非空向量,data() == addressof(front())
.
对于空(size() == 0
)向量,即使它具有非零容量,data()
也不要求返回可解引用指针。它可能返回nullptr
或一些任意值(在这种情况下,唯一的要求是它应该能够与自身进行比较,并且可以在不调用UB的情况下向其添加0)。
我想说文档在这个主题上是非常清楚的:data() + size()
之后的任何东西都可能是分配的但不是初始化的内存:如果你也想初始化这个内存,你应该使用vector::resize
。
void reserve (size_type n);
请求更改容量
要求vector容器容量至少足以容纳n个元素。
如果n大于当前向量容量,则函数导致容器需要重新分配其存储空间,将其容量增加到n(或更高)。
在所有其他情况下,函数调用不会导致重新分配且矢量容量不受影响。
该函数对vector的大小没有影响,也不能改变vector的大小
元素。
我不知道为什么你想在reserve()
之后访问data() + size()
之后的任何东西:reserve()
的预期用途是在你知道或可以估计容器的预期大小时防止不必要的重新分配,但同时避免不必要的内存初始化,这可能是低效的或不切实际的(例如,初始化的非平凡数据不可用)。在这种情况下,您可以仅用1替换log(N)
重新分配和副本,从而提高性能。