std ::向量预分配(大小为n,容量为n + 2)

我的用例如下:从二进制文件中读取大小为n的矢量。

在其他变体(iostreams,在我的例子中是自定义代码进行解压缩)中,我可以用这样的语义来做一些事情:

vector<myElem> v;
v.resize(n); // from my understanding v now has size n and capacity n
fread(v.data(), sizeof(myElem), n, myFile);

但是,后来我必须(重复地)向这样的向量添加和移除两个元素。 (虽然这听起来很愚蠢,但它可以给列表添加标记值,使得排序列表的交集不必为边界检查添加比较)。

为此,我很想prealloacte大小为n ,容量为n + 2的矢量。 我想我可以做一些事情:

vector<myElem> v;
v.resize(n + 2); // from my understanding v now has size n + 2 and capacity n + 2 
v.pop_back();
v.pop_back(); // v now has size n and most probably still has capacity 2 (unless n is pretty small)
fread(v.data(), sizeof(myElem), n, myFile);

显然,这既不美观也不保证表现得像我所愿。 在实践中,我认为这对大n来说应该是这样,如果小n应该出现,重新分配并不重要。

不过,听听是否有更好的方法,这将是一件好事。

编辑:

我不确定如何在我的情况下使用reserve 。 如果我保留n + 2的容量,矢量的大小仍为0 。 如果我调整到n ,我也会改变容量。

如果我先调整大小然后再调整大小,那么我会分配两次内存并复制整个向量。


您可以使用v.reserve(n + 2)更改vector的容量而不更改其大小。 查看文档以更好地理解正在发生的事情。


您对容量的理解不是正确的:

v.resize(n); // from my understanding v now has size n and capacity n

v大小为n ,是的,但你可以对容量说的是它是>= n 。 它可能是n ,它可能是n + 1 ,它可能是3 * n 。 同理:

v.resize(n + 2); // from my understanding v now has size n + 2 and capacity n + 2 
v.pop_back();
v.pop_back(); // v now has size n and most probably still has capacity 2 (unless n is pretty small)

在这一点上,我们可以肯定地说的是v.size() == n && v.capacity() >= n + 2

如果你想要做的是

我很想prealloacte一个大小为n,容量为n + 2的矢量

那简直就是:

v.reserve(n + 2); // capacity >= n+2, size == 0
v.resize(n);      // capacity >= n+2, size == n

你要

v.reserve(n+2);
v.resize(n);

这保证给你一个大小为n ,容量至少为n+2的向量:

23.3.7.3向量容量

void reserve(size_type n)

...在调用reserve()之后发生的插入期间,不会发生重新分配,直到插入将使vector的大小大于capacity()的值为止。

void resize(size_type n)

...如果size() < sz appaends sz - size()默认插入元素到序列中

因此,调整为大于当前大小相当于插入元素,并且在保留后,插入操作不能重新分配内存,直到其大小超过保留容量为止。

链接地址: http://www.djcxy.com/p/91713.html

上一篇: std::vector preallocation (size n, capacity n + 2)

下一篇: What happens to the underlying storage upon vector's copy/move assignment?