我正在处理一个大型数据集。当将元素一个接一个地插入集合或向量时,我有以下困惑(在C ++中):
哪个会更省时?
答案 0 :(得分:0)
在插入之前,我应该为向量保留足够的空间吗? 然后一个接一个地添加到向量中?
是的。通过为所有必需的vector
元素分配空间,您将避免额外的内存分配和内存复制。仅当您不需要任何特定顺序的元素并且仅将元素添加到vector
的末尾时,才使用vector
。将元素插入中间位置的效率非常低,因为vector
将所有元素存储在连续的内存中,因此需要在插入点之后将所有元素移开,然后再插入新元素。
或者,我应该将元素逐个插入到一组中(因为插入 到一个集合要比向量更快),然后立即设置为 向量?
如果需要按特定顺序排列元素,则应使用set
。假设您的元素属于set
可以理解的类型(例如,数值类型或string
),则该集合将有效地将元素放置在“正确的”位置,否则您可能需要编写自己的元素比较功能。另外,如果您具有更复杂的数据但可以识别可排序的键值,则可能需要查看map
而不是set
。 -之后,您将无法一次从vector
初始化set
;您将需要遍历set
并附加到vector
。
哪个会更省时?
考虑到您有大量数据作为输入,并假设数据是随机顺序的:
如果您不关心元素的顺序,那么在向量上调用push_back
可能会更快。
如果您打算在中间的某个位置插入元素,那么set
很有可能会更快,即使您需要在第二步中将数据传输到vector
上也是如此。
所有这些都取决于数据类型,您可能想要执行的潜在比较,标准库和编译器的实现。
现在,您知道预期的结果了,建议您同时尝试两者。测试和测量!