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?