【问题标题】:Is it more efficient to set the size of a vector up front?预先设置向量的大小是否更有效?
【发布时间】:2012-04-11 15:22:46
【问题描述】:

如果可以的话,预先设置矢量的大小是否更有效?我打算 push_back 值。

【问题讨论】:

  • 节省时间?节省空间?

标签: c++ stl vector


【解决方案1】:

是的,它通常效率更高一些。不要指望会有很大的改进,但最坏的情况是它是无害的(显然假设您只保留实际需要的空间)。

对于一个相当不寻常的情况,它可能会改善所花费的时间消耗的空间量。当您使用push_back 时,它会在空间不足时将大小增加一些乘法因子,但如果您使用reserve,它可能会准确分配您需要的数量,而不是四舍五入到任何因子的下一个倍数它使用。

【讨论】:

  • 无害? vec.reserve( 1024 * 1024 * 100 );
  • @Konrad 我猜你会知道如果你需要保留多少空间,它会提前而不是在半小时内中断。
  • @Konrad:是的——如果你还是要使用那个空间,用reserve 得到它至少和用几个重新分配一样有效。
  • @Joe:您通常需要一台相当旧的计算机才能预期它会损坏。假设这是一个vector<int>,你说的是大约 400 兆字节——即使是低端系统现在通常至少有 2 千兆字节的 RAM,这也算不上什么压力。
  • @JerryCoffin 我知道,但我只是在回应我相信康拉德提出的观点。但是,这仍然很容易在移动和嵌入式设备上被打破。
【解决方案2】:

如果您使用.push_back() 存储值,使用.resize() 成员函数“预先设置向量的大小”是不正确的。相反,您可以使用.reserve() 成员函数预先设置向量的容量

以下是三种正确的方法:

// 1) Do nothing initially, use .push_back
std::vector<int> v;
v.push_back(1); v.push_back(2);

// 2) Set the capacity initially, use .push_back
std::vector<int> v;
v.reserve(2);
v.push_back(1); v.push_back(2);

// 3) Set the size initiallly, use subscripts
std::vector<int> v(2); // Set the size in construction
v.resize(2);             // OR set the size by a call to .resize()
v[0] = 1; v[1] = 2; 

是的,第二种方法通常比第一种更节省尺寸和时间。

第二种方法有时比第三种更省时。或不。你应该测量它,看看它是否重要。

【讨论】:

  • size -> resize 实际设置大小。
  • 谢谢,感谢您的修复。
  • @Robᵩ - 在查看 Scott Meyers 的“更有效的 STL”第 14 项之后,我认为您建议的第二种方法是最好的 - 不是吗?
【解决方案3】:

是的,它通常会保留空间(容量),因此内存分配和数据移动较少,因为向量保证其数据连续存储。

【讨论】:

    【解决方案4】:

    是的,如果您可以预先保留适量的数据,效率会更高。 当向量达到其容量时,它必须分配新的存储空间,然后性能就会受到影响。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-10
      • 2018-04-21
      • 2010-09-12
      • 1970-01-01
      • 2022-12-14
      • 1970-01-01
      • 2010-12-10
      相关资源
      最近更新 更多