重载运算符<在排序中未使用对

overloaded operator< on pair not being used in sort

本文关键字:排序 未使用 运算符 lt 重载      更新时间:2023-10-16

我重载了pair<int,int>的小于运算,这样我就可以以特定的方式对向量进行排序。我希望它根据一对中的第一个键按升序排列,如果第一个键相等,那么我希望它按照第二个键按降序排列。

问题是排序函数似乎没有使用重载的<运算符,但如果在2对上调用<,则返回的输出就是我所期望的。我在下面附上了一段代码,我正在使用它进行测试:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool operator<(pair<int, int> &a, pair<int, int> &b)
{
    if (a.first < b.first) return true;
    else if ((a.first == b.first) && (a.second > b.second)) return true;
    return false;
}
int main() {
    vector<pair<int, int>> test {make_pair(1,10), make_pair(3,4), make_pair(3,8),  make_pair(6, 23), make_pair(1,6)};
    sort(test.begin(), test.end());
    for (int i = 0; i < test.size(); i++)
      cout << test[i].first << " - " << test[i].second << "  ";
    cout << endl;
    auto a = make_pair(3,4);
    auto b = make_pair(3,8);
    cout << (a < b) << endl;
    return 0;
}

输入矢量为{(1,10), (3,4), (3,8), (6,23), (1,6)}

我希望输出为{(1,10), (1,6), (3,8), (3,4), (6,23)}

获得的输出为{(1,6), (1,10), (3,4), (3,8), (6, 23)}

正如您所看到的,所获得的输出是在不重载的情况下使用标准<运算符所获得的。所以我认为这可能是一个问题,并检查了(3,4) < (3,8)。在这种情况下,根据我的重载运算符,答案被返回为false。那么我哪里错了?为什么sort没有受到过载操作员的影响?SO上有关于类似问题的各种问题,但找不到任何有帮助的问题。

std命名空间中已经为对定义了一个operator<,这就是您正在使用的std::sort版本所找到的。您的过载永远找不到。请改用命名谓词:

struct MyPairComparator
{
    bool operator()(const std::pair<int, int> & a,
                    const std::pair<int, int> & b) const
    {
        // ...
    }
};
sort(test.begin(), test.end(), MyPairComparator());    // ADL, maybe
//                             ^^^^^^^^^^^^^^^^^^

此外,谓词应该可以用常量值调用,因此可以按值或按常量引用获取参数。

请注意,sort位于std命名空间中。相比之下,当您在main中使用<表达式时,确实会在全局命名空间中找到您自己的重载。

您似乎使用了C++11编译器,请更正并简化lambda函数的使用。类似的东西

sort(test.begin(), test.end(), [](const pair<int, int> & a, const pair<int, int> & b) {
    if (a.first < b.first) return true;
    else if ((a.first == b.first) && (a.second > b.second)) return true;
    return false;
});