[英]How could one write a generic sorting function in C++?
有没有可能用C ++中的单个函数对自然意义上的所有数据进行排序? 就我而言,我定义了一个基于模板数据类型的链表结构,并且我希望对该链表进行排序,无论它包含在数据中如何。
泛型的含义有多个维度:
首先是最容易解决的。 我们需要考虑排序需要什么:数据的严格弱排序 。 现在我们知道了需要提供给排序算法的函数的性质,并且需要一种传递函数的方法。 在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
。
是的,您可以使用链接列表很自然地实现插入排序。 您可以编写具有与std :: sort相似的接口的模板化函数。
然后,您可以使用operator<
来比较任何种类的元素或Compare
函数。
您可以允许列表作为输入,并返回排序后的列表作为输出。
通过插入排序,复杂度将降至O(n^2)
,但这是IMO最简单的方法。 而且我认为如果没有随机访问容器,您将无法做得更好。 也许可以为列表实现合并排序。 似乎是一个不错的候选人。
或者,您可以将列表复制/移动到支持随机访问迭代器的结构中,并使用std::sort
对其进行std::sort
然后将其转换回列表。 从技术上讲,这将具有更好的复杂性,但是由于2次转换操作,常数因子相当大。 但是对于大名单,最终它将更快。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.