两个重载函数用于同一个运算符和类

时间:2016-05-06 18:29:58

标签: c++ class sorting overloading operator-keyword

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

要将它们显示到屏幕并将它们保存到文件中,我需要按ID对它们进行排序,但是要将它用于其他一些东西(比如知道十大最差的客户端),我需要按照它们的总和对它们进行排序。他们花了很多钱。

这些是客户端类operator==的重载函数,但显然它们不能共存。有人可以给我一个解决方案吗?

    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());
    }

3 个答案:

答案 0 :(得分:5)

其中一个std::sort函数重载需要一个比较器,使用该形式并为每个实例提供两个独立的函数或函子(或lambdas)。

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);

注意排序需要遵循其排序要求的比较,通常使用小于比较来排序元素。确切的比较可能不同,但需要遵守相同的排序要求(有关进一步阅读,请参阅std::sort算法的信息,以及this on 严格弱排序)。

答案 1 :(得分:0)

根据建议你可以使用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());
}

要使用它们,您需要以这种方式调用排序

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);

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

答案 2 :(得分:0)

而不是依赖于运营商&lt;要进行排序,可以将比较器显式传递给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