我有一个类,其中重载了所有比较运算符。我将一堆这些对象作为键加载到 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/