有没有可能的方法用C ++中的单个函数对自然意义上的所有类型的数据进行排序?在我的例子中,我定义了一个基于模板数据类型的链表结构,我想将该链表中的任何内容排序为数据。
答案 0 :(得分:1)
泛型可能意味着多个维度:
第一个是最容易解决的问题。我们需要考虑排序需要工作的内容: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
(具有非限定调用和使用指令,但这是一个模糊的技术性)。
第二个问题是棘手的,你实际上不想解决它,因为你只希望你的排序算法在列表实现上工作。我鼓励您深入研究std::sort及其要求,了解为何以这种方式实施,以及为什么它不适用于std::list
。
答案 1 :(得分:-1)
是的,您可以使用链表自然地实现插入排序。您可以使用与std::sort类似的接口编写模板化函数。
然后,您可以使用operator<
来比较任何类型的元素或Compare
函数。
您可以将列表作为输入,并将排序列表作为输出返回。
使用插入排序,复杂性将降至O(n^2)
,但这是IMO最简单的方法。 我不认为你可以用随机访问容器做得更好。也许可以为列表实现合并排序。看起来像个好人。
或者,您可以将列表复制/移动到支持随机访问迭代器的结构中,并使用std::sort
对其进行排序,然后将其转换回列表。从技术上讲,这将具有更好的复杂性,但由于2次变换操作而具有相当大的常数因子。但对于大型名单,最终会更快。