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

2024-02-11

In the 关于概念 N3701 的最新论文 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3701.pdf,有以下示例sort算法:

template<typename Cont>
  requires Sortable<Cont>()
void sort(Cont& cont)

where Sortable概念定义为

template<typename T>
concept bool Sortable()
{
  return Permutable_container<T>() && Totally_ordered<Value_type<T>>();
}

where Totally_ordered毫不奇怪,被定义为

template<typename T>
constexpr bool Totally_ordered()
{
  return Weakly_ordered<T>() && Equality_comparable<T>();
}

反过来Equality_comparable定义为

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

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

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

底线,在这个定义中,如果我想排序std::vector<T>,我需要T提供all比较运算符<, <=, >, >=, ==, !=。然而,在 C++ 的整个生命周期中,std::sort仅需要操作员<即将呈现!这是什么参考参数 http://en.cppreference.com/w/cpp/algorithm/sort说关于std::sort:

按升序对 [first, last) 范围内的元素进行排序。这 不保证保留相等元素的顺序。首先 版本使用运算符,第二个版本 使用给定的比较函数对象 comp。

那又怎样,这是否意味着在未来带有概念的 C++ 中,对于v类型的std::vector<T> where T仅提供operator<, std::sort(v.begin(), v.end())将编译,同时std::sort(v)将不会?这听起来很疯狂。

我在当前检查了这个范围-v3 实施 https://github.com/ericniebler/range-v3由埃里克·尼伯勒(Eric Niebler)撰写,它的工作原理就像我所描述的那样。除非提供所有运算符,否则代码不会编译。

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


Concepts TS 并不概念化标准库。这只是一个例子;而已。

Ranges TS 版本sort需要Sortable,默认其比较类为std::less<>。然而,似乎std::less<>::operator()强加TotallyOrdered对其参数类型的要求。这就是它的来源。有一个关于此的注释P0021R0 (PDF) http://wg21.link/P0021R0:

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

添加了强调。围绕此的一般问题似乎已被搁置 https://github.com/ericniebler/stl2/issues/21,等待其他语言功能(例如仅基于的所有其他运算符的隐式创建)operator<或类似的东西)。

您可以简单地使用比较函数的(正常)版本。或者你可以只使用std::sort迭代器版本,不会使用任何类型的概念。


还应该指出的是,与简介 https://botondballo.wordpress.com/2017/11/20/trip-report-c-standards-meeting-in-albuquerque-november-2017/ of “宇宙飞船操作员” http://wg21.link/P0515在 C++20 中(我们最早可以看到 Ranges TS 集成到标准中),整个讨论实际上变得毫无意义。一个简单的auto operator<=>(const MyType &) = default;在类中声明,突然间你的类型就完全有序了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么Sortable概念需要完全有序的值类型,而std::sort只需要“小于”可比较? 的相关文章

  • 在 C# 中创建具有单独列的分隔文本

    我一直在尝试在 C 中创建一个制表符限制的文本文件 以便数据正确显示在单独的列中 Firstname Lastname Age John Smith 17 James Sawyer 31 我尝试过 t 字符 但我得到的只是 Firstnam
  • 向 Nhibernate 发出 SQL 查询

    如何将此 SQL 查询发送给 Nhibernate SELECT Customer name FROM Company INNER JOIN Customer ON Company CompanyId Customer CompanyId
  • 单元测试一起运行时失败,单独运行时通过

    所以我的单元测试遇到了一些问题 我不能只是将它们复制并粘贴到这里 但我会尽力而为 问题似乎是 如果我一项一项地运行测试 一切都会按预期进行 但如果我告诉它一起运行测试 则 1 5 将通过 TestMethod public void Obj
  • 读取文件特定行号的有效方法。 (奖励:Python 手册印刷错误)

    我有一个 100 GB 的文本文件 它是来自数据库的 BCP 转储 当我尝试导入它时BULK INSERT 我在第 219506324 行上收到一个神秘错误 在解决此问题之前 我想看看这一行 但可惜的是我最喜欢的方法 import line
  • 存储来自其他程序的事件

    我想将其他应用程序的事件存储在我自己的应用程序中 事件示例 打开 最小化 Word 或打开文件时 这样的事可能吗 运行程序 http msdn microsoft com en us library ms813609 aspx and 打开
  • 如何在 C# 中定义文本框数组?

    您好 当我在 Windows 申请表上创建文本框时 我无法将其命名为 box 0 box 1 等 我这样做的目的是因为我想循环使用它们 其实我发现TextBox array firstTextBox secondTextBox 也有效
  • 获取 WPF 控件的所有附加事件处理程序

    我正在开发一个应用程序 在其中动态分配按钮的事件 现在的问题是 我希望获取按钮单击事件的所有事件 因为我希望删除以前的处理程序 我尝试将事件处理程序设置为 null 如下所示 Button Click null 但是我收到了一个无法分配 n
  • 关于在 Windows 上使用 WiFi Direct Api?

    我目前正在开发一个应用程序 我需要在其中创建链接 阅读 无线网络连接 在桌面应用程序 在 Windows 10 上 和平板电脑 Android 但无关紧要 之间 工作流程 按钮 gt 如果需要提升权限 gt 创建类似托管网络的 WiFi 网
  • 如何在 Linq 中获得左外连接?

    我的数据库中有两个表 如下所示 顾客 C ID city 1 Dhaka 2 New york 3 London 个人信息 P ID C ID Field value 1 1 First Name Nasir 2 1 Last Name U
  • 未经许可更改内存值

    我有一个二维数组 当我第一次打印数组的数据时 日期打印正确 但其他时候 array last i 的数据从 i 0 到 last 1 显然是一个逻辑错误 但我不明白原因 因为我复制并粘贴了 for 语句 那么 C 更改数据吗 I use g
  • C++:.bmp 到文件中的字节数组

    是的 我已经解决了与此相关的其他问题 但我发现它们没有太大帮助 他们提供了一些帮助 但我仍然有点困惑 所以这是我需要做的 我们有一个 132x65 的屏幕 我有一个 132x65 的 bmp 我想遍历 bmp 并将其分成小的 1x8 列以获
  • 如何使用 Mongodb C# 驱动程序连接多个集合

    我需要将 3 个集合与多个集合合并在一起 lookup我在 C 驱动程序中尝试过 它允许我 lookup用户采集但无法执行秒 lookup用于设置集合 有人可以帮忙吗 db Transactions aggregate lookup fro
  • 如何编写一个同时需要请求和响应Dtos的ServiceStack插件

    我需要提供本地化数据服务 所有本地化的响应 Dto 都共享相同的属性 IE 我定义了一个接口 ILocalizedDto 来标记那些 Dto 在请求端 有一个ILocalizedRequest对于需要本地化的请求 Using IPlugin
  • HttpWebRequest 在第二次调用时超时

    为什么以下代码在第二次 及后续 运行时超时 代码挂在 using Stream objStream request GetResponse GetResponseStream 然后引发 WebException 表示请求已超时 我已经尝试过
  • .NET中的LinkedList是循环链表吗?

    我需要一个循环链表 所以我想知道是否LinkedList是循环链表吗 每当您想要移动列表中的 下一个 块时 以循环方式使用它的快速解决方案 current current Next current List First 电流在哪里Linke
  • 为什么在setsid()之前fork()

    Why fork before setsid 守护进程 基本上 如果我想将一个进程与其控制终端分离并使其成为进程组领导者 我使用setsid 之前没有分叉就这样做是行不通的 Why 首先 setsid 将使您的进程成为进程组的领导者 但它也
  • Server.MapPath - 给定的物理路径,预期的虚拟路径

    我正在使用这行代码 var files Directory GetFiles Server MapPath E ftproot sales 在文件夹中查找文件 但是我收到错误消息说 给定物理路径但虚拟路径 预期的 我对在 C 中使用 Sys
  • 编译时“strlen()”有效吗?

    有时需要将字符串的长度与常量进行比较 例如 if line length gt 2 Do something 但我试图避免在代码中使用 魔法 常量 通常我使用这样的代码 if line length gt strlen Do somethi
  • 英特尔 Pin 与 C++14

    问题 我有一些关于在 C 14 或其他 C 版本中使用英特尔 Pin 的问题 使用较新版本从较旧的 C 编译代码很少会出现任何问题 但由于 Intel Pin 是操作指令级别的 如果我使用 C 11 或 C 14 编译它 是否会出现任何不良
  • 使用 GhostScript.NET 打印 PDF DPI 打印问题

    我在用GhostScript NET http ghostscriptnet codeplex com打印 PDF 当我以 96DPI 打印时 PDF 打印效果很好 但有点模糊 如果我尝试以 600DPI 打印文档 打印的页面会被极大地放大

随机推荐

  • 当我对符号矩阵进行行归约时,为什么 SymPy 给出了错误的答案?

    如果我要求 SymPy 对奇异矩阵进行行归约 nu Symbol nu lamb Symbol lambda A3 Matrix 3 nu 1 0 0 3 nu 2 nu 1 2 0 0 2 nu 1 nu lamb 2 3 0 0 nu
  • Safari 中的 Vue.js 渲染问题

    我有一个使用 Vue 和 Laravel 编写的作品集网站 它使用 v for 呈现项目缩略图 除了 Safari 之外 这在每个浏览器上都工作得很好 但有一个奇怪的问题 除非用户调整浏览器窗口的大小 否则图像根本不会显示 相关代码如下 d
  • 如何在使用 Python 运行 wkhtmltopdf.exe 时停止弹出窗口

    我正在使用 wkhtmltopdf exe 使用 python 将 html 转换为 pdf wkhtmltopdf exe 的弹出窗口使我在运行它时很难处理任何其他事情 我必须转换大约 200K 个文件 并且必须同时处理其他事情 但它确实
  • 是否可以将摘要式身份验证与 XMLHTTPRequest 一起使用?

    我有一个简单的问题 是否可以将摘要式身份验证与 XMLHTTPRequest 一起使用 如果答案是否定的 那么技术原因是什么 或者如果可能的话 我该怎么做 非常感谢 谷歌到目前为止还没有好的答案 EDIT 感谢您的回答 在收到随机数后修改标
  • 设置 WPF ScrollViewer 中何时滚动

    我有一个滚动查看器 其中包含一个网格 其中有一堆表单控件 文本框 复选框 组合框等 当我通过选项卡浏览控件时 滚动查看器将滚动 但仅在必要时滚动 我的意思是我通过选项卡浏览滚动查看器中的所有内容 并且仅当控件不可见时滚动查看器才会滚动 我想
  • 为什么这些线程不按顺序运行?

    当我运行这段代码时 include
  • 在 Laravel 中同步一对多关系

    如果我有一个多对多的关系 那么用它的关系更新关系是非常容易的sync method 但是我用什么来同步一对多关系呢 table posts id name table links id name post id 在这里 每一个Post可以有
  • Google OAuth:如何使用刷新令牌?

    我可以将 Android 设备上的一次性使用令牌换成访问令牌 and a 刷新令牌 我正在尝试弄清楚如何使用刷新令牌 I found this https developers google com accounts docs OAuth2
  • 在 R 中导入和分析非矩形 .csv 文件

    我将从 Mathematica 迁移到 R 在导入过程中我不需要预测数据结构 特别是我不需要在导入之前预测数据的矩形性 我有很多文件 csv文件格式如下 tasty chicken cinnamon not tasty butter pep
  • 如何在 android 中显示简单的通知? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如何在 Android 的通知栏中显
  • 寻找一种优雅且非侵入性的方式来访问类的私有方法

    免责声明 这绝不意味着在生产代码中使用 这是对 C 边缘的探索 我的问题是一个后续问题 基于与 Johannes Schaub 的讨论 在c 中调用私有方法 https stackoverflow com questions 6873138
  • 强制 enum 为 unsigned long 类型

    是否可以强制枚举的基础类型为 unsigned long 类型 谢谢 在 C 11 及更高版本中 您可以明确提及您想要的类型 enum MyEnumeration unsigned long values go here 这将允许您显式控制
  • 如何从 AWS Codebuild 构建规范文件中排除文件夹?

    所以我需要从我的工件中排除一个文件夹 但谷歌搜索找不到任何信息 version 0 2 phases install runtime versions nodejs 10 build commands echo Build started
  • 计算计算着色器内帧缓冲区的颜色直方图

    正如标题所示 我正在将场景渲染到帧缓冲区上 并尝试从计算着色器内的帧缓冲区中提取颜色直方图 我对使用计算着色器完全陌生 并且缺乏教程 示例 关键字让我不知所措 特别是 我正在努力正确设置计算着色器的输入和输出图像 这是我所拥有的 compu
  • 如何加快Python中的字符串连接速度?

    在下面的代码中 串联是瓶颈 正如你所看到的 我尝试了一些复杂的方法来加快速度 但无论如何它都很慢 我想知道是否有什么我可以做的来使它更快 顺便说一句 普通和秘密都是从二进制文件读取的数据 它们都很大 大约 1mb x b if len pl
  • 在 Cocoa 程序中访问 Swift REPL

    我可以将 LLDB 附加到用 Swift 编写的程序并访问 REPL 无论是从 Xcode 内还是通过运行 lldb n ProcessName lldb repl 1 gt 但是 如果我将 LLDB 附加到没有 Swift 运行时的进程
  • Activity 生命周期 - 每次重新定向时都会调用 onCreate

    我有一个简单的活动 可以加载位图onCreate 我发现如果我旋转设备 我可以从日志中看到onCreate又打电话来了 事实上 因为所有实例变量都再次设置为默认值 所以我知道整个 Activity 已被重新实例化 旋转 2 次后 我得到 F
  • Django 国家/地区按翻译名称排序

    我开始使用 django countries 并向我的模型之一添加一个字段 country CountryField blank True 问题是用户的语言是西班牙语 当表格显示国家列表时 它们被正确翻译 但他们是按我猜的代码或英文名称排序
  • 如何使用 Django 进行 RDS IAM 身份验证?

    我希望我的 django 应用程序使用 IAM 身份验证连接到 RDS postgres 这意味着数据库密码每 15 分钟就会过期 应该重新生成 问题是如何在运行时更改数据库密码 或者我应该更新我的数据库 URL 环境 我们为此功能实现了一
  • 为什么Sortable概念需要完全有序的值类型,而std::sort只需要“小于”可比较?

    In the 关于概念 N3701 的最新论文 http www open std org jtc1 sc22 wg21 docs papers 2013 n3701 pdf 有以下示例sort算法 template