C++ 向量'的行为;s reserve()方法
我想知道C++ 向量'的行为;s reserve()方法,c++,methods,stdvector,C++,Methods,Stdvector,我想知道std::vector::reserve()在以下情况下的行为: 假设reserve(N)立即被多次调用。 较早的保留(N1)是否会被累加或覆盖 如果先前的reserve(N1)被最近的调用覆盖, 那么,如果最新的保留(Nn)所需的插槽数较少,会发生什么情况 在声明vector之后,如果我们只有push_back()X元素, 然后我们调用reserve(N)。已经的按钮是否会向后推()X 在N中计数的元素 假设,如果向量有一些X推动元素,现在如果我们 push_back()1个元素(X+
std::vector::reserve()
在以下情况下的行为:
reserve(N)
立即被多次调用。
较早的保留(N1)
是否会被累加或覆盖reserve(N1)
被最近的调用覆盖,
那么,如果最新的保留(Nn)
所需的插槽数较少,会发生什么情况vector
之后,如果我们只有push_back()
X元素,
然后我们调用reserve(N)
。已经的按钮是否会向后推()
X
在N
中计数的元素向量
有一些X推动元素,现在如果我们
push_back()
1个元素(X+1),则该对象必须
搬迁;但是我们还没有执行push\u back()
。什么
如果我们现在调用reserve()
会发生什么?对象会被重新定位吗
马上?如果没有,那么如何保留空间reserve()。因此
所有通过的最大值将是有效保留的最小结果容量
见#1
对
调用reserve()
时,该向量分配存储传递给reserve()
的项目数所需的内存
引用实际标准:
void reserve(size_type n)
如果n
小于或等于容量()
,则此调用无效。
否则,它将请求分配额外内存。如果
请求成功,则capacity()
大于或等于n
;
否则,capacity()
将保持不变。在任何一种情况下,size()
都是
不变
假设reserve(N)
立即被多次调用。较早的保留(N1)
是否会被累加或覆盖
与std::string
不同,无法为std::vector
调用reserve()
来收缩capacity()
。使用小于当前capacity()
的参数调用reserve()
是不可操作的。因此最后一个reserve()
增加当前容量的呼叫将保持正常
如果先前的reserve(N1)
被最新的调用覆盖,那么如果最新的reserve(Nn)
需要更少的插槽数,会发生什么
使用小于当前容量()的参数调用reserve()
,是不允许的
在声明向量之后,如果我们只需要push_back()X元素,那么我们就调用reserve(N)。是否已将_back()X元素按N计
reserve()。请注意,在调用reserve()
后,只有向量的容量()
被更改,size()
保持不变。如果需要创建尽可能多的元素,而不仅仅是保留内存,则应使用resize()
假设,如果向量有一些X
被推的元素,现在如果我们push_back()
1个元素(X+1)
,那么该对象必须重新定位;但是我们还没有执行push\u back()
。如果我们现在调用reserve()
会发生什么?对象是否会立即重新定位?如果没有,那么如何保留空间
是的,搬迁会发生,但要视情况而定。如前所述,reserve()
分配足够的内存来存储传递给它的参数所包含的元素。因此,如果元素的数量大于当前向量capacity()
所能容纳的数量,就会发生重新定位
标准参考文献:
C++03 23.2.4.2向量容量[lib.vector.capacity]
void reserve(大小\u类型n)代码>
效果:一种指令,用于通知向量计划的大小更改,以便它能够相应地管理存储分配。在reserve()
之后,capacity()
如果发生再分配,则大于或等于reserve的参数;否则等于前面的capacity()
值。当且仅当当前容量小于reserve()
的参数时,此时才会发生重新分配
复杂性:它不会改变序列的大小,并且在序列的大小上花费最多的线性时间
抛出:如果n>max\u size()
.248),则抛出长度错误
注意:重新分配将使序列中引用元素的所有引用、指针和迭代器无效。可以保证在调用reserve()
后发生的插入期间不会发生重新分配,直到插入会使向量的大小大于最近调用reserve()
时指定的大小
如果您手头没有标准的副本,则可以在线查看。+1同样重要的是,如果发生重新分配(n
capacity()
);迭代器、指针和对该向量的引用将无效。考虑到这一点,reserve()
在调用push_back()
时,在实际防止重新分配(从而防止迭代器无效等)方面特别有用。#1是不准确的:至少有reserve()
请求的数量意味着生成的容量(而不是大小!)可能大于对reserve()的调用
请求最大。编辑“结果大小”->“最小结果大小”。问题不是“最小”。你在说话