C++ std::map 键排序比较函数?

标签 c++ stl dictionary

我有一个类,其中重载了所有比较运算符。我将一堆这些对象作为键加载到 map 中,并且我希望 map 对它们进行从最小到最大的排序。

但是, map 实际上是按从大到小排序的。为什么是这样?当它对映射进行排序时,它是否不使用键上的比较运算符?我怎样才能让它做到这一点?

最佳答案

如果你看一下 std::map 的定义,第三个参数是比较器 - std::less< Key >默认情况下。其默认实现只是调用 operator< .

您可以尝试在 header 中定义一个新版本,其中 YourType定义如下:

template<> std::less< YourType >
{
    bool operator()(
        const YourType& lhs,
        const YourType& rhs)
    {
        if(!(lhs.member1 < rhs.member1))
        {
           return false;
        }

        if(!(lhs.member2 < rhs.member2))
        {
           return false;
        }

        return true;
    }
}

记得加好友std::less< YourType >在你的类(class)里。

实际测试必须符合以下条件,否则会出现各种问题:

  • lhs
  • rha < lhs = false
  • lhs < lhs = false

需要注意的一件重要的事情(我最近发现的)是,如果你的编译器开始提示你重新定义了 std::less 的含义。或其他奇怪的事情,可能是您只转发声明了您的 YourType当您声明您的std::map< YourType >时.

希望这有帮助!

关于C++ std::map 键排序比较函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10680076/

相关文章:

c++ - 关于如何在基于动态数组的结构中存储键值对的想法

c++ - 如果我用memcpy函数复制一个数组,可能会有什么后果: bottlenecks and perfomance changes?

php - 基于 php 中的键查找值的有效方法

ios - 字典里面的字典

Python 关键字参数解包并返回字典

c++ - 通过高范围位置提高 DirectX 的精度?

c++ - 将 C++ 编译成汇编代码

c++ - 使用 packaged_task 和线程的可能数据竞争

c++ - 如何使用 std::pair 作为键 std::map

STL - STL 的实际文档