我需要一个容器(不一定是STL容器),这让我可以轻松地执行以下操作:
我使用 std :: list ,但它不允许我在任何位置插入(确实如此,但为此我必须迭代所有元素然后插入位置我想,这很慢,因为列表可能很大)。那么你能推荐任何有效的解决方案吗?
答案 0 :(得分:7)
我并不完全清楚你的意思是“以任何顺序迭代元素” - 这是否意味着你不关心订单,只要你可以迭代,或者你想要能够使用任意定义的标准迭代?这些是非常不同的条件!
假设您的意思是迭代顺序并不重要,可以想到几个可能的容器:
std::map
[红黑树,通常]
hash_map
或std::tr1::unordered_map
[哈希表]
答案 1 :(得分:4)
This diagram会帮助你很多,我想是的。
答案 2 :(得分:3)
vector
或deque
适合。 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个字符”这里]