C++ 保留后使用std::vector::data

C++ 保留后使用std::vector::data,c++,vector,language-lawyer,stdvector,C++,Vector,Language Lawyer,Stdvector,我有一个std::vector,我用一个大值调用reserve。然后我检索数据() 由于迭代数据会崩溃,我想知道这是否被允许。reserve是否强制将数据更新到分配的内存范围?reserve的保证是后续插入不会重新分配,因此不会导致无效。就这样。没有进一步的保证。不要求data()为空(size()==0)向量返回可取消引用的指针,即使它具有非零容量。它可能返回nullptr或某个任意值(这种情况下的唯一要求是它应该能够与自身进行比较,并且可以在不调用UB的情况下将0添加到其中) reserve

我有一个
std::vector
,我用一个大值调用
reserve
。然后我检索
数据()


由于迭代
数据
会崩溃,我想知道这是否被允许。
reserve
是否强制将
数据更新到分配的内存范围?

reserve
的保证是后续插入不会重新分配,因此不会导致无效。就这样。没有进一步的保证。

不要求
data()
为空(
size()==0
)向量返回可取消引用的指针,即使它具有非零容量。它可能返回
nullptr
或某个任意值(这种情况下的唯一要求是它应该能够与自身进行比较,并且可以在不调用UB的情况下将0添加到其中)

reserve
是否强制将
数据更新到分配的内存范围

否。该标准仅保证返回指针且
[data(),data()+size())
为有效范围,不涉及

:

返回:
[data(),data()+size())
为有效值的指针 范围。对于非空向量,
data()==addressof(front())

我要说的是,在这个主题上是非常清楚的:在
data()+size()
之后的任何内容都可以分配,但不能初始化内存:如果您还想初始化这个内存,您应该使用
vector::resize

void reserve(尺寸_类型n);

请求更改容量

请求向量容量至少足以包含n个元素

如果n大于当前矢量容量,则函数会导致 容器将重新分配其存储,并将其容量增加到n (或更高)

在所有其他情况下,函数调用不会导致重新分配 载体容量不受影响

此函数对向量大小没有影响,并且无法更改其大小 元素


首先,我不确定您为什么要在
data()+size()
之后访问
reserve()
之后的任何内容:
reserve()的预期用途
是为了在您知道或可以估计容器的预期大小时防止不必要的重新分配,但同时避免不必要的内存初始化,这可能是低效的或不切实际的(例如,用于初始化的非平凡数据不可用)。在这种情况下,您可以替换
日志(N)
重新分配和复制时只需1提高性能。

为什么
reserve
而不
resize
reserve
只分配内存,
resize
在其中构造对象。我们可以看到您的代码吗?@n.m resize可能非常昂贵。reserve将保证您以后可以放置对象。请注意,即使e> data()
是有效的,并且在向量末尾之外有分配的内存,您仍然无法保证允许访问该内存。例如,可以想象,
向量实现将该内存用于记账或其他目的。此问题:,讨论调用data()时会发生什么情况在空向量上。(您的向量是空的,因为reserve()不会更改大小。)似乎某些实现将返回null ptr。