哪个STL容器?

问题描述 投票:3回答:10

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

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

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

c++ list stl containers
10个回答
7
投票

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

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

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

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

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

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

-4
投票

的std ::矢量

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


4
投票

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


3
投票

无论是vector还是deque都适合。 vector将提供更快的访问,但deque将提供更快的instertions和删除。


1
投票

好吧,不幸的是,你不能永久地拥有所有这些。决定是否要进行更多的插入或读取,并根据该决定做出决定。

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


1
投票

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

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

1
投票

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


0
投票

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

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

以下是一些参考:


0
投票

Containers http://adrinael.net/containerchoice

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

  • 各种容器的所有最佳好处
  • 没有一个随之而来的缺点

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.