我需要一个容器(不一定是STL容器),它让我轻松地执行以下操作:
我使用了std :: list,但它不会让我插入任何位置(确实如此,但为此我必须迭代所有元素然后插入我想要的位置,这很慢,作为列表可能很大)。你能推荐任何有效的解决方案吗?
我并不完全清楚你的意思是“以任何顺序迭代元素” - 这是否意味着你不关心顺序,只要你可以迭代,或者你想要能够任意迭代定义标准?这些是非常不同的条件!
假设您的意思是迭代顺序并不重要,可以想到几个可能的容器:
std::map
[一棵红黑树,通常]
hash_map
或std::tr1::unordered_map
[哈希表]
的std ::矢量
[填充“15个字符”这里]
This diagram会帮助你很多,我想是的。
无论是vector
还是deque
都适合。 vector
将提供更快的访问,但deque
将提供更快的instertions和删除。
好吧,不幸的是,你不能永久地拥有所有这些。决定是否要进行更多的插入或读取,并根据该决定做出决定。
例如,vector将允许您在常量时间内按索引访问任何元素,在线性时间内迭代元素(所有容器应允许这样),但插入和删除需要线性时间(比列表慢)。
您可以尝试std::deque,但它不会提供中间元素的恒定时间删除但它支持
矢量。当您删除任何项目时,将最后一项复制到一个要删除的项目(或交换它们,以较快者为准)和pop_back。要插入一个位置(但是为什么要在订单无关紧要的情况下!?),在该位置推回项目并覆盖(或交换)要插入的项目。
通过“以任何顺序迭代元素”,你的意思是你需要通过索引支持前向和后向,或者你的意思是顺序无关紧要?
您需要一个称为未排序计数树的特殊树。这允许O(log(n))索引插入,O(log(n))索引删除和O(log(n))索引查找。它还允许在正向或反向进行O(n)迭代。使用它们的一个示例是文本编辑器,其中编辑器中的每行文本都是节点。
以下是一些参考:
Containers http://adrinael.net/containerchoice
但听起来您正在寻找具有以下属性的单个容器:
这是不可能的。一个好处造成损害。选择容器是妥协。
订单统计树在这里可能很有用。它基本上只是一个普通的树,除了树中的每个节点都包含其左子树中的节点计数。这支持所有基本操作,不会低于对数复杂度。在插入过程中,只要在左子树中插入项目,就会增加节点的计数。在删除期间,只要从左侧子树中删除,就会减少节点的计数。要索引到节点N,请从根目录开始。根在其左子树中具有节点数,因此您检查N是否小于,等于或大于根的计数。如果它更少,则以相同的方式在左子树中搜索。如果它更大,则下降右侧子树,将根的计数添加到该节点的计数,并将其与N进行比较。继续直到A)您找到了正确的节点,或者B)您已确定存在更少的节点比树中的N项。