C++ 在向量中调整大小并保留
主要问题 向量的C++ 在向量中调整大小并保留,c++,vector,dynamic-memory-allocation,C++,Vector,Dynamic Memory Allocation,主要问题 向量的调整大小是否会影响性能,即使其容量大于其大小 例如,我想为伪代码生成一个代码,如下所示 const size_t size_a = 2; const size_t i_max = 3; vector<int> a(size_a) = random_vector; vector<int> b; for (size_t i=0; i<i_max; i++){ patch_a_at_the_end_of_b; } 请注意,每当concat调用
调整大小
是否会影响性能,即使其容量大于其大小
例如,我想为伪代码生成一个代码,如下所示
const size_t size_a = 2;
const size_t i_max = 3;
vector<int> a(size_a) = random_vector;
vector<int> b;
for (size_t i=0; i<i_max; i++){
patch_a_at_the_end_of_b;
}
请注意,每当concat
调用b
时,我们都会调整向量的大小
然后,我在主函数的for
循环前面添加b.reserve
const size_t size_a = 2;
const size_t i_max = 3;
vector<int> a(size_a) = random_vector;
vector<int> b;
b.reserve(size_a*i_max);
for (size_t i=0; i<i_max; i++){
concat(a,b);
}
const size\u t size\u a=2;
const size_t i_max=3;
向量a(大小a)=随机向量;
载体b;
b、 预留空间(尺寸a*i最大值);
对于(size_t i=0;i而言,std::vector
s操作的规范可能提供了这个问题的大部分答案
首先,resize()
被指定为void resize(size\u type n,value\u type val=value\u type())
,带有要求
- 如果
n
小于当前大小,则删除并销毁附加元素(即,如果元素具有析构函数,则调用析构函数)
- 如果
n
大于当前容器大小,则通过在末尾插入所需数量的元素来扩展内容,以达到n
的大小。如果指定了val
,则新元素将初始化为val
的副本,否则,它们将被值初始化
- 如果
n
也大于当前容器容量(强调矿山),则会自动重新分配分配分配的存储空间
请注意,如果集装箱尺寸减小,则未提及任何关于减小集装箱容量的内容
现在,reserve(size\u type n)
被指定为请求向量容量为n
或更多元素,并满足要求
- 如果n大于当前矢量容量,则函数会导致
容器将重新分配其存储,并将其容量增加到n
(或更高)
- 在所有其他情况下,函数调用不会导致重新分配,向量容量也不会受到影响
- 此函数对向量
大小没有影响,并且不能更改其元素
这里的第二点可以解释为,reserve()
不能用于降低容量
注意:我在上面进行了解释,但它本质上是标准对resize()
和reserve()
的要求的总结
将这些点放在一起:唯一需要resize()
(或增加向量大小的任何其他操作)来增加向量容量的情况是新大小超过当前容量
除此之外,所发生的是对实施质量的关注
resize()
(以及增加向量大小的其他操作)永远不会增加容量,除非新大小超过当前容量
reserve()
从不减少容量
在这样的实现中,在执行增加向量大小的操作之前调用reserve()
,将提供性能优势(消除实际重新分配的需要,除非大小增长到超过使用reserve()
指定的容量)
如果实现使用不同的方法,例如在任何阶段减少容器的容量(例如,如果调用resize()
减小大小,它也会降低容量),则情况可能会有所不同。这可能是为了尽量减少容器的总内存使用量(即,只要向量本身存在,就不保持分配的额外容量)。如果向量的大小在大小上波动(例如,在某些情况下增加,在其他情况下减少),这将对性能造成影响.你必须在问题开始时大声喊叫吗?我把它改成了普通字体。应该是b.reserve(size\u b+size\u a*I\u max);
?b=concat(a,b);
a.S.H谢谢你的回答!
const size_t size_a = 2;
const size_t i_max = 3;
vector<int> a(size_a) = random_vector;
vector<int> b;
b.reserve(size_a*i_max);
for (size_t i=0; i<i_max; i++){
concat(a,b);
}