同一运算符和类的两个重载函数
Two overloading functions for the same operator and class
我想使用排序算法对客户端的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());
}
std::sort
函数重载之一采用比较器,使用该形式,并为每个实例化提供两个独立的函数或函子(或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);
注意排序需要一个符合其排序要求的比较,通常它使用小于的比较来排序元素。确切的比较可能不同,但需要遵守相同的排序要求(有关进一步的阅读,请参阅std::sort
算法的信息,以及严格弱排序)。
根据建议,您可以使用std:sort算法。您需要创建两个函数,每个函数用于sum和Id比较,并将它们作为函数指针进行比较。
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);
除了比较函数,您还可以通过使用函子或函数对象来使用更复杂的方法。
而不是依赖运算符<要进行排序,可以显式地将比较器传递给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
相关文章:
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 运算符重载 (+),用于添加两个具有 C++ 的数组
- 重载运算符 (<<) cout 在 c ++ 中不起作用,当我互相减去两个矩阵时不起作用
- oStream 不打印添加两个 valarray 的结果(使用运算符重载)
- 为什么在传递长整型时调用具有两个双精度类型的参数的重载函数?
- 使用运算符重载的两个复数的总和
- 为什么我不能用两个参数重载 C++ 运算符 []?
- 两个相同的重载运算符[]一个返回引用
- C++stoi:这两个重载都无法转换所有参数类型
- 重载 == 以递归方式比较两个链表
- 如何在两个不同的类之间重载"=="运算符?
- 为什么 std::p romise::set_value() 有两个重载
- 同一运算符和类的两个重载函数
- 将调用两个重载模板中的哪一个
- 为什么这两个重载函数的声明方式不同
- 为什么 vector::p ush_back 有两个重载
- 如果两个重载函数相似,如何进行更好的设计
- 模板类两个重载函数
- 为什么 std::forward 有两个重载
- 为什么push_back有两个重载左值和右值