为什么std::sort和partial_sort需要随机访问迭代器?

why do std::sort and partial_sort require random-access iterators?

本文关键字:sort 随机 访问 迭代器 std partial 为什么      更新时间:2023-10-16

我想知道为什么c++标准要求std::sort应该只采用随机访问迭代器?我看不出有什么好处,因为std::sort和std::list::sort的复杂度都是N*log(N)。将std::sort限制为随机访问迭代器(RAI)似乎使得有必要为具有相同复杂性的列表编写单独的函数。

同样适用于partial_sort,其中list的非rai对应部分到目前为止只是缺少。

这个设计是因为人们使用quick_sort的变体来实现std::sort吗?

如果在RAI容器上编写排序算法有优势,那么让std::sort更通用,并让像std::vector这样的RAI容器提供专门的v.sort会更好吗?

O(N*log(N))复杂性并不意味着容器是按顺序迭代的,也不意味着对它的更改只是按扫描顺序进行的。如果使用顺序迭代器来存储所有这些迭代器,则需要O(N)的内存开销。

算法复杂度并不能说明一切。实际上在c++中(从形式的角度来看)它没有说任何东西,因为你不能将N增长到无穷大(size_t不是任意精度数),因此在c++中编写的每个排序算法(形式上)也是O(1)

从实用的角度来看,std::sortqsort的孙子,它很可能是作为快速排序的一种变体实现的。

对数组使用归并排序将需要与数组大小成正比的额外存储空间(链接到下一个元素),而对列表进行归并排序不需要任何额外的空间,因为你可以重用节点中已经存在的链接(无论如何它都会被排序破坏)。

在不知道处理哪种容器的情况下编程的想法主要是一种错觉,因此使用两种不同的显式方法对两种不同类型的容器进行有效排序本身并不被认为是坏的。

确实很烦人,std::sort没有包含列表迭代器的专门化(我不是模板元编程专家,但这似乎很容易做到)。