为什么std::sort和partial_sort需要随机访问迭代器?
why do std::sort and partial_sort require random-access iterators?
我想知道为什么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::sort
是qsort
的孙子,它很可能是作为快速排序的一种变体实现的。
对数组使用归并排序将需要与数组大小成正比的额外存储空间(链接到下一个元素),而对列表进行归并排序不需要任何额外的空间,因为你可以重用节点中已经存在的链接(无论如何它都会被排序破坏)。
在不知道处理哪种容器的情况下编程的想法主要是一种错觉,因此使用两种不同的显式方法对两种不同类型的容器进行有效排序本身并不被认为是坏的。
确实很烦人,std::sort
没有包含列表迭代器的专门化(我不是模板元编程专家,但这似乎很容易做到)。
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 为什么 Serial.println(<char[]>);返回随机字符?
- 字符串-C++后显示的随机字符
- 为什么 std::unique 不调用 std::sort?
- 循环中的随机函数
- 在c++构造函数中使用随机字符串生成器
- 对字符串进行排序时,在c++中处理sort()
- std::sort()函数无法对向量的一部分进行排序
- 使用std::mt19937从字符串中返回一个随机单词
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- 如何在C++中高效地构造随机骰子
- 在类中使用随机生成器时出现性能问题
- 在将数字随机生成为数组期间从内存输出随机数的数组
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- 将字符随机转换为大写的函数
- C++中"std::sort"比较器的不同类型
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 按字母顺序对字符串中的字母进行排序,而无需使用内置的 sort()
- 为什么std::sort和partial_sort需要随机访问迭代器?