有没有可能用C ++中的单个函数对所有类型的自然数据进行排序的方法?在我的情况下,我定义了一个基于模板数据类型的链表结构,并且我希望对该链表进行排序,无论它包含什么作为数据。

最佳答案

泛型的含义有多个维度:


关于数据的通用
关于容器的通用


首先是最容易解决的。我们需要考虑排序需要进行哪些工作:数据的strict weak ordering。现在我们知道了需要提供给排序算法的函数的性质,并且需要一种传递函数的方法。在C ++中,假定operator<实现这样的命令或将Functor传递给实现它的算法已成为一种规范。因此签名将变为:

template<typename T, typename Comp = std::less<T>>
my_sort(my_list<T>& l, Comp c = Comp());


我们的排序算法必须执行另一项操作:交换元素。因为我们在自己的小世界里,所以我们可以假设所有类型都有一个成员函数T::swap(T& rhs)来执行此操作。在现实世界中,我们将使用自由函数std::swap(具有不合格的调用和using指令,但这是一个晦涩的技术性)。

第二个问题要棘手得多,您实际上不想解决它,因为您只希望排序算法可用于列表实现。我鼓励您深入研究std::sort及其要求,以了解为什么以这种方式实现了它,以及为什么它不适用于std::list

09-05 18:45
查看更多