问题描述
我有一组指针,我希望该组按特定顺序排序。
我想出了这个代码,它按预期工作:
#include <string>
#include <iostream>
#include <set>
class Data
{
public:
std::string name;
int data;
bool operator < (const Data& other) const
{
return name < other.name;
}
bool operator < (const Data* other) const
{
std::cout << "never called ";
return name < other->name;
}
};
struct DataComparator
{
bool operator()(const Data* lhs,const Data* rhs) const
{
return *lhs < *rhs;
}
};
int main() {
Data d1{ "bb",1 };
Data d2{ "cc",2 };
Data d3{ "aa",3 };
std::set<Data*,DataComparator> s;
s.insert(&d1);
s.insert(&d2);
s.insert(&d3);
// print set members sorted by "name" field
for (auto& d : s)
std::cout << d->name << "\n";
return 0;
}
困扰我的是我需要使用 DataComparator
结构来实现自定义排序顺序。我希望比较器成为 Data
类的一部分。我尝试实现 bool operator < (const Data* other) const
类成员并将集合声明为 std::set<Data*> s;
,但现在 operator <
函数(不出所料)从未被调用,并且排序顺序是按指针地址。
有什么方法可以直接在 Data
类中实现自定义比较器,所以我可以这样做:
std::set<Data*> s;
...
// print set members sorted by "name" field
for (auto& d : s)
std::cout << d->name << "\n";
解决方法
有什么方法可以直接在 Data 类中实现自定义比较器,这样我就可以拥有 [东西]:
没有。我会写一个模板
template <typename T>
struct PointerLess
{
bool operator()(const T * lhs,const T * rhs) const
{
return *lhs < *rhs;
}
};
然后你会有 std::set<Data*,PointerLess<Data>>
等