【问题标题】:Printing the index of an iterator in std::map在 std::map 中打印迭代器的索引
【发布时间】:2014-11-10 08:53:18
【问题描述】:

我正在使用std::mapfind() 方法,它返回一个迭代器
但是我需要找到元素的 index ;例如: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(二叉树)不是一个好的容器。但是,在实际代码中,我必须搜索大量元素,而二叉树对此很有用。

有什么想法吗?

【问题讨论】:

  • 如何定义二叉树结构的索引?
  • @40two:地图不一定是实现为树,也没有树状接口;但它是有序的,因此您可以根据问题描述的顺序定义索引。
  • @MikeSeymour 根据标准,它不一定作为树实现,同意。然而,在我所知道的每一个实现中,都是以树的形式实现的。此外,当插入或提取发生时,任何先前的顺序都会被打乱。因此,正如您正确回答的那样,您可以定义一个索引,但仅限于 std::map 的当前状态。

标签: c++ map iterator


【解决方案1】:

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

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

不过,如果您确实想使用地图:

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

【讨论】:

    【解决方案2】:

    使用std::distance,像这样:

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

    文档here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-02
      • 1970-01-01
      • 2018-09-26
      相关资源
      最近更新 更多