与this线程类似,我试图从迭代器获取整数索引,但是对于地图而不是向量。它导致我的代码中出现了一个大瓶颈,我想知道是否有一种更有效的方法来获取索引,而不是我目前所做的...
auto itTail = nodesMap.find(tail);
tailNodePos = distance(nodesMap.begin(), itTail);
答案 0 :(得分:0)
我想说,map
的任意迭代器的索引不能快于O(container size)
(根据C ++标准中的map
规范)。如果以更快的速度执行它非常重要,我会尝试使用自定义平衡二叉搜索树(因为如果树中的每个节点都维护子树,则可以在O(log(container size))
中获取树中节点的索引大小)。
如果没有执行插入和删除操作,则很容易使用已排序的vector
和lower_bound
而不是map
和find
(此方法允许在{中获取索引) {1}}因为O(1)
迭代器是一个随机访问迭代器。)
答案 1 :(得分:0)
如果你想要一个具有快速索引(第n个元素和索引元素)和快速排序顺序插入/删除的容器,你必须自己编写,或者找到std
之外的容器。
这不是一个棘手的设计 - 一个b树或rb树,其中每个节点还保持计数下它有多少节点只有一个“裸”节点上的适度开销。编写接口的其余部分以匹配std::map
是一个艰难的过程,就像编写原始树操作代码一样。
几年前我试图在boost
找到一个但失败了。也许是多索引容器的东西:但是,序列是插入顺序,而不是顺序映射组件。