2

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

struct Object_ptr_comparer {
    bool operator()(const Object* first, const Object* second) {
        return *first < *second;
    }
};

并使用例如std::sort

Object_ptr_comparer comp;
std::sort(data_str.begin(), data_str.end(), comp);

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

4

2 回答 2

10

模板呢?

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

像这样使用:

std::sort(data_str.begin(), data_str.end(), ptr_comparer());
于 2012-11-26T21:37:07.010 回答
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());

由于我已经模板化了操作符而不是直接专门化比较器,编译器可以推导出类型,所以我们不必直接放入类型。

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

我确定这个编译

于 2012-11-26T21:37:25.210 回答