在std :: map中打印迭代器的索引

时间:2014-09-16 14:34:32

标签: c++ map iterator

我正在使用find()的{​​{1}}方法,该方法返回迭代器
但是我需要找到的元素的索引;例如:0,对应std::map,依此类推。

std::map::begin()

那不编译,我知道原因。但是,我需要一种打印#include <map> #include <utility> #include <iostream> int main() { std::map< int, int > aMap; aMap.insert( std::make_pair(100, 50) ); aMap.insert( std::make_pair(200, 40) ); aMap.insert( std::make_pair(300, 60) ); std::map< int, int >::iterator it_map = aMap.find(300); if (it_map != aMap.end()) std::cout << it_map << "\n"; // error } 的方法,因为300的索引是2。

对于这个简单的例子,你可能会说map(二叉树)不是一个好容器。但是,在实际代码中,我必须搜索大量元素,二叉树对此有好处。

有什么想法吗?

2 个答案:

答案 0 :(得分:8)

如果你需要索引,那么地图可能是错误的数据类型;你需要遍历地图(在线性时间内)来找到索引,失去了对数时间搜索的好处。

使用lower_bound算法以对数时间查找元素的排序向量可能更合适。然后你可以在begin()迭代器中以恒定时间减去生成的随机访问迭代器。

尽管如此,如果你想使用地图:

std::cout << std::distance(aMap.begin(), it_map) << '\n';

答案 1 :(得分:5)

使用std::distance,如下所示:

std::cout << std::distance(std::begin(aMap),it_map) << endl;

文档here