如何使用std :: map获取双向迭代器的索引?

时间:2013-06-22 19:19:01

标签: c++ map stl iterator

What is the most effective way to get the index of an iterator of an std::vector?解释了如何为std::vectorstd::list执行此操作,但std::map怎么办?

2 个答案:

答案 0 :(得分:2)

最简单的方法是使用std::distance函数:

auto index = std::distance(myMap.begin(), myMapItr);

然而,这在O(n)时间内运行,这对于大型地图来说效率很低。

如果需要将迭代器的索引确定为映射或其他有序集合,则可能需要搜索包含order statistic tree的库,这是一个支持高效的修改后的二进制搜索树(O( 1)或O(log n))时间查找树中特定值的索引。

或者,如果您手动迭代树,则可以在迭代器旁边放置一个计数器,每次从一个元素遍历到下一个元素时,它都会递增。这给O(1)时间查找迭代器的索引,但不是完全通用的。

希望这有帮助!

答案 1 :(得分:-1)

试试这个:

int IndexOf(Type *t)
{
    Type** data = vector.data();

    int index = 0;

    while(*data++ != t)
    {
        index ++;
    }

    return index ;
}