【问题标题】:Is there a widely available C++ version of Java's NavigableMap interface?Java 的 NavigableMap 接口是否有广泛可用的 C++ 版本?
【发布时间】:2011-07-21 13:48:47
【问题描述】:

在Java 中,您可以拥有NavigableMap,它可以让您做一些有用的事情,例如“找到小于或等于给定值的最大键”(floorKey 方法)。所以如果myMap包含{1->"One", 2->"Two", 3->"Three", 7->"Seven"},你可以调用myMap.floorKey(6),它会返回@的key 987654325@.

在 C++ 中,STL 提供了一个map 类,默认情况下它根据键值升序对条目进行排序。这很好,但是我怎样才能在 C++ 中做类似于 floorKey 的事情呢?到目前为止我发现的所有参考资料都建议您必须手动进行(即定义一个迭代器,收敛于键 - 最好使用二进制搜索,然后找到下一个较低的键)。是否有广泛可用的库函数来执行此操作?

【问题讨论】:

    标签: java c++ sorting stl map


    【解决方案1】:

    在 C++ 中最简单的方法是调用 map::upper_bound 并递减返回的迭代器:

    #include <map>
    #include <string>
    #include <iostream>
    int main()
    {
            std::map<int, std::string> myMap =
                   {{ 1, "One"},
                    {2, "Two"},
                    {3, "Three"},
                    {7, "Seven"}};
    
            auto i = myMap.upper_bound(6);
            std::cout << (--i)->first << '\n';
    }
    

    但要注意极端情况(如果upper_bound 返回begin(),或者地图为空等)

    试运行:https://ideone.com/TP3DL

    【讨论】:

    • lower_bound 的工作方式与floorKey 不同 -> “找到给定值小于或等于的最大键”。对(--lower_bound(7))-&gt;first 的调用仍会产生3
    • @Xeo:是的,我在你回答之前就注意到了。
    • 啊,对不起。当我写那条评论时,我仍然加载了你未经编辑的答案。
    【解决方案2】:

    使用优先队列。您是否有理由必须使用地图?

    【讨论】:

      猜你喜欢
      • 2011-11-05
      • 2010-11-02
      • 2018-06-30
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-18
      • 1970-01-01
      相关资源
      最近更新 更多