向量与集合效率

时间:2019-03-30 01:56:51

标签: c++ vector time set

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

  • 在插入向量之前,我应该为该向量保留足够的空间,然后再逐个添加到向量吗?
  • 或者,我应该将元素逐个插入到集合中(因为插入到集合中的速度比向量要快),然后立即将元素集合插入向量吗?

哪个会更省时?

1 个答案:

答案 0 :(得分:0)

  

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

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

  

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

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

  

哪个会更省时?

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

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

如果您打算在中间的某个位置插入元素,那么set很有可能会更快,即使您需要在第二步中将数据传输到vector上也是如此。

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

现在,您知道预期的结果了,建议您同时尝试两者。测试和测量!