【问题标题】:std::vector vs std::list for insertion frequency and dynamic sizestd::vector 与 std::list 的插入频率和动态大小
【发布时间】:2014-05-10 03:07:44
【问题描述】:

考虑我必须向容器中添加随机数量的项目的情况,即无法预测容器的大小,插入的频率很高,并且插入应该在容器的末尾,除此之外,我想删除一个几乎恒定时间的元素。

注意:我还想使用共享内存中的列表或向量。

那么在这种情况下,使用 std::vector 还是 std::list 哪个更好?

【问题讨论】:

  • 必须删除的元素在哪里?但最终我对几乎所有这些问题的回答是使用矢量作为默认值,如果您不确定,请使用列表制作第二个版本进行比较。又名简介它!
  • @RaphaelMiedl ,元素可以在任何地方。我需要随机访问。我还看到每次我需要向向量中添加元素时,都必须重新分配一个新的大小,这不适用于列表。
  • 也可以考虑std::deque。
  • 移除一个元素后是否需要其他元素的顺序相同?
  • 不,我不需要,我读过关于 dequeue 的文章,他们说对于涉及频繁插入或删除除开头或结尾以外的位置的元素的操作,deques 的性能更差并且有迭代器和引用的一致性不如列表和转发列表。

标签: c++ list c++11 vector shared-memory


【解决方案1】:

随着 cmets 的澄清,答案是 std::vector。这并不奇怪,因为std::list 很少是工作的最佳容器。

将元素添加到末尾是摊销常数时间,删除随机索引处的元素与list 一样快,因为在list 中查找元素通常比从vector 中删除它们需要更长的时间。

请注意,如果顺序无关紧要,您可以将vector 的任意元素与末尾元素交换,然后将pop_back 用于恒定时间随机访问擦除。

如果您定期迭代容器,您可以remove_if - erase 以便同时有效地擦除元素。如果擦除发生在与迭代不同的时间,将元素标记为“待擦除”,然后在下一次迭代中擦除它们可以使事情保持正常。

如果元素顺序无关紧要,另一个要考虑的容器是unordered_set

【讨论】:

  • 如果对象对move 来说是昂贵的,unique_ptr 的向量有时也是一个好主意。 .reset()ing 可用于标记以便以后删除。
  • 如果顺序无关紧要,std::partition - eraseswap - pop_back 的多重删除等效项。
猜你喜欢
  • 2018-05-31
  • 2012-05-07
  • 1970-01-01
  • 2010-09-19
  • 2013-08-18
  • 1970-01-01
  • 2020-11-22
  • 2017-03-22
  • 2018-06-06
相关资源
最近更新 更多