一组指向带有自定义比较器的对象的指针

问题描述

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

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

#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>>