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是的,您可以!我刚测试过@丹尼尔马奎斯:不,你不能。它会编译,但不会正确排序。它在不可伸缩性和反对称性方面都失败了,这是谓词函数的要求。是否有更好的排序算法也可以将谓词作为参数?