为指针后面的对象创建比较器的通用方法

Won*_*abo 2 c++ sorting pointers compare functor

我使用数据结构,并对这些数据结构进行了大量排序.这些数据结构保存指向对象的指针,而不是直接指向对象本身.现在我可以编写一个简单的比较函数或函数来告诉排序算法如何对指针进行排序:

struct Object_ptr_comparer {
    bool operator()(const Object* first, const Object* second) {
        return *first < *second;
    }
};
Run Code Online (Sandbox Code Playgroud)

并使用例如std::sort:

Object_ptr_comparer comp;
std::sort(data_str.begin(), data_str.end(), comp);
Run Code Online (Sandbox Code Playgroud)

这个解决方案的唯一问题是我必须为任何类型的类编写额外的指针比较器函子.是的,我可以使用继承和多态来只写一些根类的比较器,但我不想这样做.有没有其他聪明的方法来做到这一点?

Bap*_*cht 10

模板怎么样?

struct ptr_comparer {
    template<typename T>
    bool operator()(const T* first, const T* second) {
        return *first < *second;
    }
};
Run Code Online (Sandbox Code Playgroud)

像这样使用:

std::sort(data_str.begin(), data_str.end(), ptr_comparer());
Run Code Online (Sandbox Code Playgroud)

  • 如果您模拟运算符而不是结构,则可以推导出T. (3认同)

Moo*_*uck 8

这就是模板的用途!

struct ptr_comparer {
    template<class Object>
    bool operator()(const Object* first, const Object* second) const {
        return std::less<Object>()(*first, *second);
    }
};

std::sort(data_str.begin(), data_str.end(), ptr_comparer());
Run Code Online (Sandbox Code Playgroud)

由于我已经模仿运算符而不是直接对比较器进行特殊化,因此编译器可以推导出类型,因此我们不必直接放置类型.

我使用std::less而不是operator<,因为它安全地比较指针(如char**),而不是依赖于未定义的行为. std::less重新开始operator<,因此它不会给调用代码增加任何复杂性,并且应该没有任何缺点.

我确定这个编译