Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指向具有自定义比较器的对象的指针集_C++_Stdset - Fatal编程技术网

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

C++ 指向具有自定义比较器的对象的指针集,c++,stdset,C++,Stdset,我有一组指针,我希望该集合按特定顺序排序 我提出了这个代码,它的工作原理与预期一致: #include <string> #include <iostream> #include <set> class Data { public: std::string name; int data; bool operator < (const Data& other) const { return name < other.

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

我提出了这个代码,它的工作原理与预期一致:

#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;
}
是否有某种方法可以直接在数据类中实现自定义比较器,这样我就可以使用[stuff]:

不,我会写一个模板

template <typename T>
struct PointerLess
{
    bool operator()(const T * lhs, const T * rhs) const
    {
        return *lhs < *rhs;
    }
};
模板
无结构指针
{
布尔运算符()(常数T*lhs,常数T*rhs)常数
{
返回*左侧<*右侧;
}
};

然后你会有
std::set
等等。

你知道你的
bool Data::operator<(const Data*other)const
隐式地将
const Data&
作为它的第一个参数吗?这就是它从未被调用的原因。但是这个集合是指针(Data*),而不是数据本身。所以比较器需要是指针。您不能隐式使用要使用的数据类的比较运算符而不是指针比较运算符(不创建像您那样的旁路运算符),可能必须对
std::less
进行专门化,因为这是
std::set
用作默认参数的内容。@code:“仅当声明依赖于至少一种程序定义的类型时,才允许将任何标准库类模板的模板专用化添加到命名空间std中。。。“指向用户定义类型的指针算作程序定义类型吗?@FrançoisAndrieux不,指针从来都不是用户定义的。这不完全是我想要的,但还是比我的解决方案好一些。顺便说一句,你忘了
后的
常量
…T*rhs)
template <typename T>
struct PointerLess
{
    bool operator()(const T * lhs, const T * rhs) const
    {
        return *lhs < *rhs;
    }
};