当前位置:  开发笔记 > 编程语言 > 正文

为什么Sortable概念需要完全有序的值类型,而std :: sort只需要"小于"可比性?

如何解决《为什么Sortable概念需要完全有序的值类型,而std::sort只需要"小于"可比性?》经验,为你挑选了1个好方法。

在关于概念N3701的最新论文中,该sort算法有以下示例:

template
  requires Sortable()
void sort(Cont& cont)

其中Sortable概念被定义为

template
concept bool Sortable()
{
  return Permutable_container() && Totally_ordered>();
}

其中Totally_ordered,毫不奇怪,定义为

template
constexpr bool Totally_ordered()
{
  return Weakly_ordered() && Equality_comparable();
}

反过来Equality_comparable被定义为

template
constexpr bool Equality_comparable()
{
  return requires(T a, T b) {
    {a == b} -> bool;
    {a != b} -> bool;
  };
}

我没有找到定义Weakly_ordered,但我相信它应该是这样的(我是对的吗?)

template
constexpr bool Weakly_ordered()
{
  return requires(T a, T b) {
    {a < b} -> bool;
    {a <= b} -> bool;
    {a > b} -> bool;
    {a >= b} -> bool;
  };
}

底线,在这个定义,如果我要进行排序std::vector,我需要吨至提供所有比较运算符<,<=,>,>=,==,!=.但是,在C++的整个生命周期中,std::sort只需要<提供操作员!以下是cppreference所说的内容std::sort:

按升序对[first,last]范围内的元素进行排序.不保证保持相等元素的顺序.第一个版本使用operator <来比较元素,第二个版本使用给定的比较函数对象comp.

那么,这是否意味着,在未来的C++与概念,对于v类型std::vector,其中T只规定operator<,std::sort(v.begin(), v.end())将编译,而std::sort(v)不会呢?这听起来很疯狂.

我在Eric Niebler 的当前range-v3实现中检查了这个,它就像我描述的那样工作.除非提供所有运算符,否则代码不会编译.

另见相关讨论:https://github.com/ericniebler/range-v3/issues/271



1> Nicol Bolas..:

Concepts TS没有概念化标准库.这只是一个例子; 而已.

的范围TS版本sort需要Sortable,缺省其比较类std::less<>.但是,它似乎std::less<>::operator()强加了TotallyOrdered对其参数类型的要求.这就是它的来源.在P0021R0中有一个关于此的说明(PDF):

[编者注:删除[utility.arg.requirements]中的表[lessthancomparable].将LessThanComparable替换为TotallyOrdered(确认这是一个突破性更改,使类型要求更严格).用对[concepts.lib.compare.totallyordered]的引用替换对[lessthancomparable]的引用

强调补充说.围绕此问题的一般性问题似乎暂时搁置,等待其他语言功能(例如仅基于operator<或某些隐式创建所有其他运算符).

您可以简单地使用(理智)版本的比较函数.或者您可以使用std::sort迭代器版本,它不会使用任何类型的概念.


还应当指出的是,随着推出的的"宇宙飞船经营者"在C++ 20(最早我们可以看到集成到标准的范围TS),这整个的讨论实际上变成毫无意义.auto operator<=>(const MyType &) = default;在课堂上一个简单的声明,突然你的类型是完全有序的.

推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有