【问题标题】:The ordering of an std::mapstd::map 的排序
【发布时间】:2015-12-04 23:00:22
【问题描述】:

对于std::map,我是否可以始终相信begin() 在迭代时根据类型的比较运算符返回具有最小键的元素?

换句话说……

std::map<Key, SomeClass>::iterator smallestKeyIt = someMap.begin(); 会给我地图中键最小的对吗?

这是为std::map 保证的顺序还是我可以以某种方式配置它?我的理解是,在执行添加和删除元素等操作时,底层树结构保持有序。

【问题讨论】:

  • begin 返回一个引用最小键的迭代器。最小键由映射的比较运算符定义,默认为<,但可以被覆盖。插入或删除时地图保持有序。

标签: c++ iterator stdmap


【解决方案1】:

我可以始终相信 begin() 根据类型的比较运算符返回具有最小键的元素吗?

是的。

这是为 std::map 保证的顺序还是我可以以某种方式对其进行配置?

是的。您可以通过指定比较器来配置比较的行为。 (默认是std::less。)

来自cppreference

template<
    class Key,
    class T,
    class Compare = std::less<Key>,
    class Allocator = std::allocator<std::pair<const Key, T> >
> class map;

std::map 是一个排序的关联容器,包含键值 与唯一键配对。使用比较对键进行排序 功能比较。搜索、删除和插入操作 对数复杂度。地图通常实现为red-black trees

【讨论】:

    【解决方案2】:

    std::map 定义为:

    template<
        class Key,
        class T,
        class Compare = std::less<Key>,
        class Allocator = std::allocator<std::pair<const Key, T> >
    > class map;
    

    您可以使用专用的Compare 来配置map 的条目的排序方式。例如,如果您使用:

    std::map<int, double, std::greater<int>> myMap;
    

    那么,myMap 中的第一个条目将具有最大的键。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-08
      • 2015-01-31
      • 2014-04-30
      相关资源
      最近更新 更多