为什么std :: list <int>不可排序?

时间:2017-11-22 20:00:08

标签: c++ list c++-concepts c++20

我刚刚阅读了一篇关于C ++概念的(印刷版,德语)文章(C ++ 20)。

本文使用Sortable概念提供了函数模板的示例:

template<typename Cont>
  requires Sortable<Cont>()
void sort(Cont& container) { ... }

它声称编译器会拒绝以下代码:

std::list<int> lst = { 1, 7, 5, 12 };
sort(lst);

出现如下错误:

  

错误:lst不是带&lt;

的随机访问容器

假设文章是正确的 - 为什么 int 列表值无法排序?对我来说,整数的列表就像是在考虑“可排序”的东西时的典型例子?!

不,我不是在询问 std :: sort 。我在问:为什么概念可排序不适用于std::list<int>

3 个答案:

答案 0 :(得分:7)

  

不,我不是在询问 std :: sort 。我在问:为什么概念Sortable不能用于std :: list?

嗯,这一切都取决于 你如何定义概念可排序。因此,在您正在阅读的文本的上下文中,可能假设 Sortable 容器必须在random-access-iterator上运行 - std::sort例如需要一对随机存取迭代器;它不能对容器的元素进行排序,比如std::list,它不支持随机访问迭代器。

然而,意味着你无法定义自己的概念,例如 FlexySortable (以及算法flexy_sort)可以在非随机访问迭代器。本文简单地给出了 概念的 示例,以解释关于概念如何帮助您表达意图和假设的一般概念直接在编译器可以通过执行谓词(即概念)来验证的代码中。

答案 1 :(得分:3)

std::list主要是doubly-linked list。所以它显然不是随机可访问的:访问n th 元素需要O(n)线性时间(不是常数,即O(1))。

std::vector随机可访问;访问n th 元素需要恒定的时间。所以它有一个随机访问迭代器。

This是一个相关的问题。

答案 2 :(得分:2)

Sortable概念未在语言中定义;你必须自己定义它。据推测,它是在本章前面定义的?

请注意,与概念不同的Ranges TS 不是而是C ++ 2a的一部分,定义了Sortable concept。迭代器上的位置唯一要求来自Permutable,只需要ForwardIterator s。