哪个STL容器?

时间:2009-10-15 04:59:59

标签: c++ list stl containers

我需要一个容器(不一定是STL容器),这让我可以轻松地执行以下操作:

  • 在任何位置插入和移除元素
  • 按索引访问元素
  • 按任意顺序迭代元素

我使用 std :: list ,但它不允许我在任何位置插入(确实如此,但为此我必须迭代所有元素然后插入位置我想,这很慢,因为列表可能很大)。那么你能推荐任何有效的解决方案吗?

10 个答案:

答案 0 :(得分:7)

我并不完全清楚你的意思是“以任何顺序迭代元素” - 这是否意味着你不关心订单,只要你可以迭代,或者你想要能够使用任意定义的标准迭代?这些是非常不同的条件!

假设您的意思是迭代顺序并不重要,可以想到几个可能的容器:

std::map [红黑树,通常]

  • 插入,删除和访问是O(log(n))
  • 迭代按索引排序

hash_mapstd::tr1::unordered_map [哈希表]

  • 插入,移除和访问都是(大约)O(1)
  • 迭代是'随机'

答案 1 :(得分:4)

This diagram会帮助你很多,我想是的。

答案 2 :(得分:3)

vectordeque适合。 vector将提供更快的访问权限,但deque将提供更快的插入和删除。

答案 3 :(得分:1)

嗯,不幸的是,你无法在不变的时间内完成所有这些工作。决定你是否要做更多的插入或读取,并根据这个做出决定。

例如,vector将允许您在常量时间内按索引访问任何元素,在线性时间内迭代元素(所有容器应允许这样),但插入和删除需要线性时间(慢于a列表)。

答案 4 :(得分:1)

您可以尝试std::deque,但它不会提供中间元素的恒定时间删除但它支持

  • 随机访问元素
  • 恒定时间插入和移除 元素结尾处 序列
  • 线性时间插入和移除 中间的元素。

答案 5 :(得分:1)

矢量。当您删除任何项目时,将最后一项复制到一个要删除的项目(或交换它们,以较快者为准)和pop_back。要在一个位置插入(但是为什么你应该,如果订单无关紧要!?),请在该位置推回项目并覆盖(或交换)要插入的项目。

答案 6 :(得分:0)

通过“以任何顺序迭代元素”,你的意思是你需要通过索引支持前向和后向,或者你的意思是顺序无关紧要?

您需要一个名为未排序的计数树的特殊树。这允许O(log(n))索引插入,O(log(n))索引删除和O(log(n))索引查找。它还允许在正向或反向进行O(n)迭代。使用它们的一个示例是文本编辑器,其中编辑器中的每行文本都是节点。

以下是一些参考资料:

答案 7 :(得分:0)

订单统计树在这里可能很有用。它基本上只是一个普通的树,除了树中的每个节点都包含其左子树中的节点计数。这支持所有基本操作,不会低于对数复杂度。在插入过程中,只要在左子树中插入项目,就会增加节点的计数。在删除期间,只要从左侧子树中删除,就会减少节点的计数。要索引到节点N,请从根目录开始。根在其左子树中具有节点数,因此您检查N是否小于,等于或大于根的计数。如果它更少,则以相同的方式在左子树中搜索。如果它更大,则下降右侧子树,将根的计数添加到该节点的计数,并将其与N进行比较。继续直到A)您找到了正确的节点,或者B)您已确定存在更少的节点比树中的N个项目。

答案 8 :(得分:0)

Containers http://adrinael.net/containerchoice

但听起来您正在寻找具有以下属性的单个容器:

  • 各种容器的所有最佳好处
  • 没有任何后续的缺点

这是不可能的。一个好处造成损害。选择容器是关于妥协

答案 9 :(得分:-4)

的std ::矢量

[填充“15个字符”这里]