C++ 同一运算符和类的两个重载函数

C++ 同一运算符和类的两个重载函数,c++,class,sorting,overloading,operator-keyword,C++,Class,Sorting,Overloading,Operator Keyword,我想使用排序算法对客户机的向量进行排序,但问题是我有两个不同的标准对它们进行排序 要将它们显示在屏幕上并保存到文件中,我需要按ID对它们进行排序,但要将其用于其他事情(如了解前十大最差客户),我需要按它们花费的金额对它们进行排序 这些是客户端类的操作符==的重载函数,但显然它们不能共存。有人能给我一个解决办法吗 class Client { public: //... unsigned int getID() const; doub

我想使用排序算法对客户机的
向量进行排序,但问题是我有两个不同的标准对它们进行排序

要将它们显示在屏幕上并保存到文件中,我需要按ID对它们进行排序,但要将其用于其他事情(如了解前十大最差客户),我需要按它们花费的金额对它们进行排序

这些是客户端类的
操作符==
的重载函数,但显然它们不能共存。有人能给我一个解决办法吗

    class Client
    {
    public:
    //...
        unsigned int getID() const;
        double getSum() const;
    //...
    private:
        unsigned int ID;
        //...
        double sum;
    };

    bool operator==(const Client &LHS, const Client &RHS)
    {
        return (LHS.getID() == RHS.getID());
    }

    bool operator==(const Client &LHS, const Client &RHS)
    {
        return (LHS.getSum() == RHS.getSum());
    }
其中一个函数重载采用比较器,使用该形式,并为每个实例化提供两个独立的函数或functor(或lambda)

class Client
{
public:
    //...
    unsigned int getID() const;
    double getSum() const;
    //...
private:
    unsigned int ID;
    //...
    double sum;
};

bool CompareByID(const Client &LHS, const Client &RHS)
{
    return (LHS.getID() < RHS.getID());
}

bool CompareBySum(const Client &LHS, const Client &RHS)
{
    return (LHS.getSum() < RHS.getSum());
}

// ...
std::sort(container.begin(), container.end(), CompareByID);
类客户端
{
公众:
//...
无符号int getID()常量;
双getSum()常量;
//...
私人:
无符号整数ID;
//...
双和;
};
bool CompareByID(常量客户端和LHS、常量客户端和RHS)
{
返回(LHS.getID()

注意排序需要一个符合排序要求的比较,通常它使用小于比较来对元素排序。精确的比较可能不同,但需要遵守相同的排序要求(有关进一步阅读,请参阅
std::sort
算法和严格弱排序的信息)。

如建议,您可以使用std:sort算法。 您需要为sum和Id比较分别创建2个函数,并将它们作为函数指针传递以进行比较

bool compare_by_ID(const Client &LHS, const Client &RHS)
{
        return (LHS.getID() < RHS.getID());
}


bool compare_by_sum(const Client &LHS, const Client &RHS)
{
        return (LHS.getSum() < RHS.getSum());
}
bool按ID进行比较(常量客户端和LHS、常量客户端和RHS)
{
返回(LHS.getID()
要使用它们,您需要以这种方式调用sort

vector<Client> v;  
// assume v contains list of clients.

// for comparison by sum
std:sort(v.begin(),v.end(),compare_by_sum);

// for comparison by Id
std:sort(v.begin(),v.end(),compare_by_ID);
向量v; //假设v包含客户机列表。 //以总和作比较 标准:排序(v.begin()、v.end()、按和比较); //通过Id进行比较 标准:排序(v.begin(),v.end(),按\u ID比较);

除了比较函数外,您还可以使用更复杂的方法,使用functor或function对象。

您可以显式地将比较器传递给std::sort:

std::vector<Client> vec;
...
auto sortByID = [](auto lhs, auto rhs){ return lhs.getID() < rhs.getID(); };
std::sort(vec.begin(), vec.end(), sortByID);
//vec is now sorted by ID

auto sortBySum = [](auto lhs, auto rhs){ return lhs.getSum() < rhs.getSum(); }
std::sort(vec.begin(), vec.end(), sortBySum);
//vec is now sorted by Sum
std::向量向量向量机;
...
auto-sortByID=[](auto-lhs,auto-rhs){返回lhs.getID()
将它们命名为成员函数?您可以使用显式比较器进行排序。运算符==只是一个示例,显然排序算法也将使用其他(<和>)@user2357112抱歉,我是初学者,我不知道这是什么或如何使用它。你能发布一个解决方案或提示吗?非常感谢。真不敢相信我居然没想到!您当然不能将这些函数用作
std::sort
@BenjaminLindley的谓词。该死没有更新内部比较,现在已更新。@BenjaminLindley是的,您可以!我刚测试过@丹尼尔马奎斯:不,你不能。它会编译,但不会正确排序。它在不可伸缩性和反对称性方面都失败了,这是谓词函数的要求。是否有更好的排序算法也可以将谓词作为参数?