Vector会在每个push_back上重新分配

时间:2010-04-27 19:47:31

标签: vector push-back

IDE - Visual Studio 2008,Visual C ++

  1. 我有一个自定义类 Class1 ,带有一个复制构造函数。
  2. 我还有向量
  3. 使用以下代码插入数据
  4.  Class1* objClass1;
     vector<Class1> vClass1;
    
     for(int i=0;i<1000;i++) {
    
        objClass1 = new Class1();
        vClass1.push_back(*objClass1);
        delete objClass1;
    
         

    }

    现在,在每次插入时,都会重新分配向量,并将所有现有内容复制到新位置。例如,如果向量有5个元素,如果我插入第6个元素,则前5个元素和新元素将被复制到新位置(我通过在复制构造函数中添加日志语句来计算它。)

    在使用 reserve()时,这不会按预期发生!我有以下问题

    1. 是否必须始终使用保留声明?
    2. 每次执行 push_back 时,vector是否会重新分配;还是因为我调试
    3. 而发生

2 个答案:

答案 0 :(得分:2)

  1. 这不是强制性的,这是一种优化,因为重新分配是昂贵的。
  2. 我认为这是一个实现细节,它重新分配的频率。我认为向量在每次重新分配时将其存储量加倍是正常的,但正如我所说,这可能因实现而异。 (可能是因为你在调试版本中,它比正常情况更频繁地重新分配。)

答案 1 :(得分:1)

通过将您的复制构造函数测试放入非调试代码中来了解,并告诉我们您的平台获得了什么! IMO向量不应该在每次回击时重新分配。有更智能的方法来管理内存,我敢打赌实施者没有这样做的钱。