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

Printing the index of an iterator in std::map

本文关键字:迭代器 打印 索引 std map      更新时间:2023-10-16

我使用std::mapfind()方法,该方法返回迭代器
但是,我需要找到的元素的索引;例如:0,对应于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
}

它没有编译,我知道原因。但是,我需要一种打印2的方法,因为300的索引是2。

对于这个简单的例子,您可能会说map(二进制树)不是一个好的容器。然而,在实际的代码中,我必须搜索大量的元素,而二进制树很适合这样做。

知道吗?

如果您需要索引,那么映射可能是错误的数据类型;您需要(在线性时间内)遍历映射以找到索引,从而失去对数时间搜索的优势。

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

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

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

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

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

此处的文档