获取地图迭代器索引的最有效方法是什么? C ++

时间:2014-06-22 17:06:32

标签: c++ map iterator

this线程类似,我试图从迭代器获取整数索引,但是对于地图而不是向量。它导致我的代码中出现了一个大瓶颈,我想知道是否有一种更有效的方法来获取索引,而不是我目前所做的...

auto itTail = nodesMap.find(tail);
tailNodePos = distance(nodesMap.begin(), itTail);

2 个答案:

答案 0 :(得分:0)

我想说,map的任意迭代器的索引不能快于O(container size)(根据C ++标准中的map规范)。如果以更快的速度执行它非常重要,我会尝试使用自定义平衡二叉搜索树(因为如果树中的每个节点都维护子树,则可以在O(log(container size))中获取树中节点的索引大小)。
如果没有执行插入和删除操作,则很容易使用已排序的vectorlower_bound而不是mapfind(此方法允许在{中获取索引) {1}}因为O(1)迭代器是一个随机访问迭代器。)

答案 1 :(得分:0)

如果你想要一个具有快速索引(第n个元素和索引元素)和快速排序顺序插入/删除的容器,你必须自己编写,或者找到std之外的容器。

这不是一个棘手的设计 - 一个b树或rb树,其中每个节点还保持计数下它有多少节点只有一个“裸”节点上的适度开销。编写接口的其余部分以匹配std::map是一个艰难的过程,就像编写原始树操作代码一样。

几年前我试图在boost找到一个但失败了。也许是多索引容器的东西:但是,序列是插入顺序,而不是顺序映射组件。