指向具有自定义比较器的对象的指针集



我有一组指针,我希望该集按特定顺序排序。

我想出了这个代码,它按预期工作:

#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类中实现自定义比较器,这样我就可以拥有〔stuff〕:

否。我会写一个模板

template <typename T>
struct PointerLess
{
bool operator()(const T * lhs, const T * rhs) const
{
return *lhs < *rhs;
}
};

然后你会有std::set<Data*, PointerLess<Data>>

相关内容

  • 没有找到相关文章

最新更新