我使用数据结构,并且我对这些数据结构进行了大量排序。这些数据结构保存指向对象的指针,而不是直接指向对象本身。现在我可以编写一个简单的比较函数或函数来告诉排序算法如何对指针进行排序:
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);
这个解决方案的唯一问题是我必须为任何类型的类编写额外的指针比较器函子。是的,我可以使用继承和多态来只写一些根类的比较器,但我不想这样做。还有其他聪明的方法吗?
答案 0 :(得分: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());
答案 1 :(得分: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::less
会回到operator<
,因此它不会给调用代码增加任何复杂性,也不会有任何缺点。