【问题标题】:why only std::list::sort()? [duplicate]为什么只有 std::list::sort()? [复制]
【发布时间】:2011-11-03 13:58:40
【问题描述】:

可能重复:
Sort list using stl sort function

C++标准库给出了严格的线性序列容器、线性序列容器、关联容器。

std::sort() 适用于各种容器。但是为什么只有它为列表提供排序。 std::list::sort()?

【问题讨论】:

  • 大概是因为可以有一个更优化的实现,可以利用列表的实现细节——这对于一般的排序函数可能不可用
  • 给出解释here
  • @Nim:不是真的。查看回复。

标签: c++ sorting stl


【解决方案1】:

std::sort 仅适用于随机访问容器。标准库中唯一可以排序的非随机访问容器是std::list

std::sort 当然不能像您想象的那样在关联容器上工作。那会有什么意义?关联容器是通过键的值而不是位置来访问的。

正如 Mike 所说,C++11 也有 std::forward_list,它也有自己的排序函数。

【讨论】:

  • 这些天也std::forward_list
  • 另请注意,列表排序和标准排序的复杂性保证是不同的。
  • @KerrekSB:根据 C++11,两者都是 O(N log N)。
  • @ybungalobill:是的,你是对的。主要区别在于std::sort 重新分配元素,而std::list::sort 移动节点 而不触及它们的值。
【解决方案2】:

std::sort 仅适用于随机访问迭代器,但 std::list 仅提供双向迭代器。由于它因此不能与std::sort 一起使用,因此它需要自己的实现,这也可能针对双向链表进行更多优化。

同样,您不能将 std::mapstd::set 迭代器与 std::sort 一起使用。但是对于这些,您无论如何都不需要它,因为它们总是被排序的。

顺便说一句,还有std::map::find之类的。这些确实不是必需的,因为您可以将所有迭代器与std::find 一起使用。但是成员函数版本为各个容器提供了优化的算法,比std::find的线性复杂度更高效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    • 2020-11-03
    • 2014-07-22
    • 2010-11-09
    • 2016-06-07
    • 2010-10-11
    相关资源
    最近更新 更多