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);
}