【问题标题】:Vector vs Set Efficiency向量与集合效率
【发布时间】:2019-03-30 01:56:51
【问题描述】:

我正在处理一个大型数据集。在将元素一个接一个地插入到集合或向量中时,我遇到了以下困惑(在 C++ 中):

  • 是不是应该在插入前为向量预留足够的空间,然后一个一个地添加到向量中?
  • 或者,我应该将元素一个接一个地插入到一个集合中(因为插入到一个集合中比插入一个向量快),然后立即将那个集合插入到一个向量中?

哪个更省时?

【问题讨论】:

  • 没有通用的答案。 std::setstd::vector 服务于两个完全不同的目的。一个集合中不能有重复的值,但一个向量中可以有任意多个值。对于两个,std::set 是一个有序的关联容器,并对其元素进行排序。 std::vector 没有。找出满足您需求的最佳解决方案的最佳方法是更多地了解 C++ 库中的各种容器,并了解它们有何不同以及为什么不同。完全有可能集合或向量都不是满足您要求的正确解决方案。

标签: c++ vector time set


【解决方案1】:

我应该在插入之前为向量保留足够的空间吗? 然后一一添加到向量中?

是的。通过为所有必需的vector 元素分配空间,您将避免额外的内存分配和内存复制。仅当您不需要任何特定顺序的元素并且只将元素添加到vector 的末尾时,才使用vector。在中间某处插入元素效率非常低,因为vector 将所有元素存储在连续内存中,因此在插入新元素之前需要将插入点之后的所有元素移开。

或者,我应该将元素一个一个地插入到一个集合中(因为插入 到一个集合比一个向量更快)然后那个集合立即到 向量?

如果您需要按特定顺序排列元素,则应使用set。假设您的元素属于set 可以理解的类型(例如,数字类型或string),该集合将有效地将元素放置到“正确”的位置,否则您可能需要编写自己的比较函数。或者,如果您有更复杂的数据但可以识别可排序的键值,那么您可能希望查看map 而不是set。 - 之后,您不能“一次”从set 初始化vector;您需要遍历set 并附加到vector

哪个更省时?

考虑到您有大量数据作为输入并假设数据是随机顺序的:

如果您不关心元素的顺序,那么在向量上调用 push_back 很可能会更快。

如果您打算在中间某处插入元素,那么set 很可能更快,即使您需要在第二步中将数据传输到vector

所有这些都取决于数据的类型、您可能想要执行的潜在比较、标准库和编译器的实现。

既然您知道预期的结果,我建议您尝试两者。测试和测量!

【讨论】:

  • 非常感谢您的详细解释!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
  • 1970-01-01
相关资源
最近更新 更多