[英]Does std::vector::reserve reallocate the internal array?
我有一个接受int *
并修改传入数组的函数。我提前知道它将访问多少个元素。 假设这是m
值。
如果我在vector<int>
上调用reserve(m)
然后将指针data()
发送给函数,将会发生什么?
我的猜测是,如果我随后从指针访问数据就像是数组,那么这样做可能会起作用,但是如果我尝试使用operator []
从向量中检索此数据,向量的大小将不会已更新,我将遇到问题。 所以我应该只使用resize(m)
来做到这一点。
不要做 这是未定义的行为,完全是不允许的。 相反,您应该执行几乎同样昂贵的resize()
操作,然后传递data()
指针。
唯一增加的成本来自内存清零。 不幸的是,除了std::unique_ptr<int[]>(new int[m])
,没有标准的库容器可以处理未初始化的动态存储。 但是,清零的成本非常小(但是从概念上讲,这可能很烦人,因为您知道您将要覆盖数据)。 我想在高性能的情况下,您可以尝试使用唯一指针方法。 (请注意,基本类型的array- new[]
通常完全等效于::operator new()
或malloc()
)。
正确,在空向量上的reserve(m)
仅保证下一个m push_back()
不会触发重新分配。 向量的大小仍将保持为0,并且禁止写入分配的数据。
在这里调用resize(m)
是正确的方法。
void reserve ( size_type n );
仅在当前容量小于n时才重新分配内部数组。
reserve
更改了容器的内部大小(因此, capacity()
现在更大了),但是数组的size
没有增长( size()
保持与调用前相同)。 因此,要直接回答您的问题, 是的 ,它使向量的capacity
至少为n
,其中n
是您要reserve
的参数。
我不知道在调用data()
(或执行&v[0]
)并通过以下方式访问数组时,如果capacity
足够大(但size
较小),访问vector
的末尾是否为未定义行为?那个指针。 我不认为这是未定义的行为,只要您在向量中使用POD类型并且在写入它们之前不读取它们即可。 但是不要对类类型进行尝试,因为超出向量size
的元素将被初始化,并且使用的元素将是UB。
不过,这样做毫无意义,因为当您尝试在向量上push_back
入push_back
或调用resize
实际更新大小时,它将覆盖您颠覆性地写入向量的值。 只需使用resize
或使用vector(int)
构造函数来设置构造大小。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.