同一运算符和 class 的两个重载函数
Two overloading functions for the same operator and class
我想使用排序算法对我的 vector
个客户进行排序,但问题是我有两个不同的标准来对它们进行排序。
要将它们显示在屏幕上并将它们保存到文件中,我需要按 ID 对它们进行排序,但要将其用于其他一些事情(比如了解前十名最差的客户),我需要按他们花的钱。
这些是operator==
对客户端class的重载函数,但显然它们不能共存。有人可以给我一个解决方案吗?
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
算法的信息,以及this on 严格的弱排序).
按照建议,您可以使用 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);
除了比较函数之外,您还可以通过使用仿函数或函数对象来使用更复杂的方法。
您可以显式地将比较器传递给 std::sort:
,而不是依赖 operator< 进行排序
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
我想使用排序算法对我的 vector
个客户进行排序,但问题是我有两个不同的标准来对它们进行排序。
要将它们显示在屏幕上并将它们保存到文件中,我需要按 ID 对它们进行排序,但要将其用于其他一些事情(比如了解前十名最差的客户),我需要按他们花的钱。
这些是operator==
对客户端class的重载函数,但显然它们不能共存。有人可以给我一个解决方案吗?
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
算法的信息,以及this on 严格的弱排序).
按照建议,您可以使用 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);
除了比较函数之外,您还可以通过使用仿函数或函数对象来使用更复杂的方法。
您可以显式地将比较器传递给 std::sort:
,而不是依赖 operator< 进行排序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