繁体   English   中英

std :: vector :: reserve是否重新分配内部数组?

[英]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_backpush_back或调用resize实际更新大小时,它将覆盖您颠覆性地写入向量的值。 只需使用resize或使用vector(int)构造函数来设置构造大小。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM