我有一个std::vector
,在它上面调用reserve
时传入了一个很大的值。之后我检索data()
。
由于迭代data
会导致崩溃,我想知道这样做是否被允许。 reserve
是否强制更新data
以适应分配的内存范围?
我有一个std::vector
,在它上面调用reserve
时传入了一个很大的值。之后我检索data()
。
由于迭代data
会导致崩溃,我想知道这样做是否被允许。 reserve
是否强制更新data
以适应分配的内存范围?
reserve
的保证是后续插入不会重新分配,因此不会导致失效。就是这样。没有其他的保证。
reserve
是否强制更新分配的内存范围中的data
?
不是。标准只保证std::vector::data
返回指针,并且[data(), data() + size())
是一个有效的范围,而capacity
并不相关。
§23.3.11.4/1 vector data [vector.data]:
返回:这样一个指针,以使
[data(), data() + size())
是一个有效的范围。对于非空向量,data() == addressof(front())
。
对于空向量 (size() == 0
),即使其容量不为零,data()
并没有要求返回可解引用的指针。它可能返回 nullptr
或者一些任意的值(唯一的要求是该值能与自身比较,并且 0 可以被添加到该值上而不会触发未定义行为)。
data() + size()
之后的任何内容都可以被分配,但不是初始化的内存:如果您想要初始化此内存,您应该使用vector::resize
。
我不确定为什么你会想要在
void reserve (size_type n);
请求更改容量
请求向量容量至少足以包含n个元素。
如果n大于当前向量容量,则函数会导致容器重新分配其存储空间,将其容量增加到n(或更大)。
在所有其他情况下,函数调用不会导致重新分配,并且向量容量不受影响。
此函数对向量大小没有影响,也不能修改其元素。
reserve()
后访问 data() + size()
之后的任何内容: reserve()
的预期使用是在你知道或可以估计容器的预期大小时,避免不必要的重新分配内存,同时避免不必要的内存初始化(例如,初始化所需的数据不可用可能会导致效率低下或不切实际)。在这种情况下,你可以将 log(N)
次重新分配和复制替换为只有1次,从而提高性能。
reserve
而不是resize
?reserve
只分配内存,resize
会在其中构造对象。 - n. m.data()
是有效的并且向量末尾之外分配了内存,您仍然不能保证允许访问该内存。例如,vector
实现可能正在使用该内存进行簿记或其他用途。 - user1084944