std::sort 使用自定义比较器

2023-11-27

在下面的代码中,为什么这三个IntComparator(), IntComparator2 and IntComparator3作为第三个参数sort()功能?他们不会有不同的左值函数类型吗?基于https://en.cppreference.com/w/cpp/algorithm/sort it says

比较函数的签名应该等于 下列的:

bool cmp(const Type1 &a, const Type2 &b);

这似乎匹配IntComparator2 better?

另外哪一个更可取?第三个选项似乎更简单、更直观。


#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>

struct IntComparator
{
  bool operator()(const int &a, const int &b) const
  {
    return a < b;
  }
};

bool IntComparator2 (const int &a, const int &b)
{
    return a < b;
}

bool IntComparator3 (int a, int b)
{
    return a < b;
}

int main()
{
    int items[] = { 4, 3, 1, 2 };
    std::sort(items, items+4, IntComparator());

    for (int n=0; n<4; n++) {
        std::cout << items[n] << ", ";
    }

    std::cout << "\n";

    int items2[] = { 4, 3, 1, 2 };
    std::sort(items2, items2+4, IntComparator2);

    for (int n=0; n<4; n++) {
        std::cout << items2[n] << ", ";
    }

    std::cout << "\n";

    int items3[] = { 4, 3, 1, 2 };
    std::sort(items3, items3+4, IntComparator3);

    for (int n=0; n<4; n++) {
        std::cout << items3[n] << ", ";
    }

    std::cout << "\n";

    return 0;
}

std::sort接受一个functor。这是可以调用的任何对象(使用正确的参数)。该函数通过使用模板来实现这一点,如下所示

template<typename Iter, typename Comp>
void sort(Iter begin, Iter end, Comp compare) { ... }

IntComparator1、2 和 3 都是该比较器的有效函子,因为它们都可以使用带有 2 个整数的 operator() 来调用。

也正如您所说,第三种选择通常确实更直观。

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

std::sort 使用自定义比较器 的相关文章

  • 使用Physics.Raycast 和Physics2D.Raycast 检测对象上的点击

    我的场景中有一个空的游戏对象 带有 2D 组件盒碰撞器 我将脚本附加到该游戏对象 void OnMouseDown Debug Log clic 但是当我点击我的游戏对象时 没有任何效果 你有什么想法 如何检测我的盒子碰撞器上的点击 使用光
  • 向 Nhibernate 发出 SQL 查询

    如何将此 SQL 查询发送给 Nhibernate SELECT Customer name FROM Company INNER JOIN Customer ON Company CompanyId Customer CompanyId
  • 如何在 C# 中从 UNIX 纪元时间转换并考虑夏令时?

    我有一个从 unix 纪元时间转换为 NET DateTime 值的函数 public static DateTime FromUnixEpochTime double unixTime DateTime d new DateTime 19
  • 如何修复此错误“GDI+ 中发生一般错误”?

    从默认名称打开图像并以默认名称保存 覆盖它 我需要从 Image Default jpg 制作图形 将其放在 picturebox1 image 上并在 picurebox1 上绘制一些图形 它有效 这不是我的问题 但我无法保存 pictu
  • 在新的浏览器进程中打开 URL

    我需要在新的浏览器进程中打开 URL 当浏览器进程退出时我需要收到通知 我当前使用的代码如下 Process browser new Process browser EnableRaisingEvents true browser Star
  • 读取文件特定行号的有效方法。 (奖励:Python 手册印刷错误)

    我有一个 100 GB 的文本文件 它是来自数据库的 BCP 转储 当我尝试导入它时BULK INSERT 我在第 219506324 行上收到一个神秘错误 在解决此问题之前 我想看看这一行 但可惜的是我最喜欢的方法 import line
  • 如何从 .resx 文件条目获取注释

    资源文件中的字符串有名称 值和注释 The ResXResourceReader类让我可以访问名称和值 有办法看评论吗 你应该能够得到Comment via ResXDataNode class http msdn microsoft co
  • 如何访问另一个窗体上的ListView控件

    当单击与 ListView 所在表单不同的表单中的按钮时 我试图填充 ListView 我在 Form1 中创建了一个方法以在 Form2 中使用 并将参数传递给 Form1 中的方法 然后填充 ListView 当我调试时 我得到了传递的
  • 如何在 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
  • 如何在 Vim 中对数字和文字列进行排序

    使用 Vim 6 0 假设我正在编辑这个文件 sdfsdg dfgdfg 34 12 2 4 45 1 34 5 如何对第二列进行排序 如果您有合适的 shell 请选择您的号码并运行命令 lt gt sort n k 2 如果您要在视觉模
  • 未定义的行为或误报

    我 基本上 在野外遇到过以下情况 x x 5 显然 它可以在早期版本的 gcc 下编译干净 在 gcc 4 5 1 下生成警告 据我所知 警告是由 Wsequence point 生成的 所以我的问题是 这是否违反了标准中关于在序列点之间操
  • 在一个字节中存储 4 个不同的值

    我有一个任务要做 但我不知道从哪里开始 我不期待也绝对不想要代码中的答案 我想要一些关于该怎么做的指导 因为我感到有点失落 将变量打包和解包到一个字节中 您需要在一个字节中存储 4 个不同的值 这些值为 NAME RANGE BITS en
  • PlaySound 可在 Visual Studio 中运行,但不能在独立 exe 中运行

    我正在尝试使用 Visual Studio 在 C 中播放 wav 文件 我将文件 my wav 放入项目目录中并使用代码 PlaySound TEXT my wav NULL SND FILENAME SND SYNC 我按下播放按钮 或
  • Visual Studio 中的测试单独成功,但一组失败

    当我在 Visual Studio 中单独运行测试时 它们都顺利通过 然而 当我同时运行所有这些时 有些通过 有些失败 我尝试在每个测试方法之间暂停 1 秒 但没有成功 有任何想法吗 在此先感谢您的帮助 你们可能有一些共享数据 检查正在使用
  • (de)从 CSV 序列化为对象(或者最好是类型对象的列表)

    我是一名 C 程序员 试图学习 C 似乎有一些内置的对象序列化 但我在这里有点不知所措 我被要求将测试数据从 CSV 文件加载到对象集合中 CSV 比 xml 更受青睐 因为它更简单且更易于人类阅读 我们正在创建测试数据来运行单元测试 该集
  • Server.MapPath - 给定的物理路径,预期的虚拟路径

    我正在使用这行代码 var files Directory GetFiles Server MapPath E ftproot sales 在文件夹中查找文件 但是我收到错误消息说 给定物理路径但虚拟路径 预期的 我对在 C 中使用 Sys
  • memset 未填充数组

    u32 iterations 5 u32 ecx u32 malloc sizeof u32 iterations memset ecx 0xBAADF00D sizeof u32 iterations printf 8X n ecx 0
  • 使用 GROUP 和 SUM 的 LINQ 查询

    请帮助我了解如何使用带有 GROUP 和 SUM 的 LINQ 进行查询 Query the database IEnumerable
  • 防止在工厂方法之外实例化对象

    假设我有一个带有工厂方法的类 class A public static A newA Some code logging return new A 是否可以使用 a 来阻止此类对象的实例化new 那么工厂方法是创建对象实例的唯一方法吗 当
  • 如何正确使用 std::condition_variable?

    我很困惑conditions variables以及如何 安全 使用它们 在我的应用程序中 我有一个创建 gui 线程的类 但是当 gui 是由 gui 线程构造时 主线程需要等待 情况与下面的函数相同 主线程创建互斥体 锁和conditi

随机推荐

  • 测试 Chef 角色和环境

    我是 Chef 新手 一直在使用测试厨房测试我的食谱的有效性 效果很好 现在 我试图在最初运行 Chef 之前确保生产节点上特定于环境的属性正确 这些将在角色中定义 例如 我可能有使用带有开发设置的 Vagrant 盒子聚合的菜谱 这会验证
  • 服务器如何处理来自多个客户端的 Web 服务请求

    我刚刚完成了一个 Android 应用程序 它使用 Web 服务连接到远程数据库 我在本地主机上工作 现在 我计划在服务器上托管我的 Web 服务 假设我的 Android 应用程序安装在任意数量的不同客户端智能手机上 每个智能手机用户同时
  • 以节省内存的方式增长 data.frame

    根据逐行创建 R 数据框 附加到 a 并不理想data frame using rbind 因为它每次都会创建整个 data frame 的副本 我如何积累数据R导致data frame而不受到这种处罚 中间格式不需要是data frame
  • 一般来说,解引用指针表达式结果是引用类型吗?

    引用指针会导致间接使用对象的值 但我从来没有真正理解 使用 是什么意思 我开始思考这个问题 直到我的编译器对以下代码产生错误 int i 0 pi i decltype pi c error c declared as reference
  • 快速更改 UINavigationBar 中 UIBarButtonItem 的宽度

    我需要在 swift 2 0 中为导航栏按钮设置框架 我试过这个代码 self navigationController navigationBar drawRect CGRectMake 0 0 30 30 但这行不通 提前致谢 Swif
  • Java中可以写swap方法吗? [复制]

    这个问题在这里已经有答案了 问题是 编写一个交换两个变量的方法 这两个变量应该是原语 它不需要是通用的 例如二int变量 有办法吗 虽然不可能编写一个简单地交换两个变量的函数 但可以编写一个辅助函数这使您能够 使用交换两个变量只有一个声明
  • 成员函数隐藏自由函数

    void foo int class X void foo void bar foo 42 error no matching function for call to X foo int note candidate is note vo
  • 为什么“object”是“type”的实例,而“type”是“object”的实例?

    我有点困惑object and typePython 3 中的类 也许有人可以消除我的困惑或提供一些额外的信息 我目前的理解是每个班级 除了object 继承自一个名为的基类object 但每堂课 包括object 也是该类的一个实例typ
  • 如何使用 jquery 或 JavaScript 在一次浏览中上传多个文件

    我正在开发一个网络应用程序 其中我为多个文件创建了一个页面 一次上传一个浏览文件 而不是一次上传一个文件 用户将能够通过单击浏览来选择多个文件 如果有人对此有解决方案 欢迎 Thanks 对于替代解决方案 您可以使用 HTML5 多重上传
  • android 的事件监听器是如何工作的?

    如何从 View 对象捕获事件 只有一个线程在运行 UI 线程 当我们没有实现任何我们自己的线程时 假设我已经为按钮实现了 onClickListener 并且该按钮的功能是 取消 对于由按钮引发的事件 即取消 UI 正在执行的任何操作 它
  • 如何保存控制台应用程序的输出

    我需要有关如何让我的 C 控制台应用程序通过标准输出向用户显示文本 同时仍然能够稍后访问它的建议 我想要实现的实际功能是在程序执行结束时将整个输出缓冲区转储到文本文件中 当我找不到更干净的方法时 我使用的解决方法是子类化TextWriter
  • 格式化 linq 查询结果中的日期

    以下 linq toEntity 查询给出以下结果 public class UserCountResult public DateTime date get set should this be string instead public
  • Python检测linux关机并在关机前运行命令

    是否可以检测并中断 linux Ubuntu 16 04 关闭信号 例如单击电源按钮或电池耗尽 我有一个总是录制视频的Python应用程序 我想检测这样的信号 所以我在操作系统关闭之前正确关闭录制 当linux关闭时 所有进程都会收到SIG
  • Eclipse 动态 Web 项目 - 默认起始页

    我在 Eclipse 中创建了动态 Web 项目 WEB INF 文件夹中有index html 我点击项目主文件夹 Run as gt Run on server 选择 Tomcat v7 0 完成 运行正常 但是 当我将 index h
  • 为什么没有 OutOfMemoryError 子类?

    众所周知 造成这种情况的原因是多方面的OutOfMEmoryError see 第一个答案 为什么只有一个异常涵盖所有这些情况 而不是继承自的多个细粒度异常OutOfMEmoryError 我预料到了 因为当这种情况发生时 你真的无能为力
  • constexpr 问题,为什么这两个不同的程序使用 g++ 运行的时间如此不同?

    我正在使用 gcc 4 6 1 并且得到一些有趣的行为 涉及调用constexpr功能 这个程序运行得很好并且立即打印出来12200160415121876738 include
  • 如何在 Java 中以编程方式启动和停止 Amazon EC2 实例

    如何启动和停止亚马逊EC2在java中以编程方式使用aws sdk实例 非常感谢任何帮助 因为我花了一天时间试图解决这个问题 我最近在Bamboo AWS 插件 它是开源的并且代码可在 Bitbucket 上找到 您可以找到如何启动 停止
  • 异步 NSURLConnection 抛出 EXC_BAD_ACCESS

    我不太确定为什么我的代码抛出 EXC BAD ACCESS 我遵循了 Apple 文档中的指南 void getMessages NSString stream NSString myURL NSString stringWithForma
  • matplotlib 循环为每个类别绘制子图

    我正在尝试编写一个循环 该循环将生成一个包含 25 个子图的图形 每个国家 1 个子图 我的代码制作了一个包含 25 个子图的图形 但这些图是空的 我可以更改什么以使数据出现在图表中 fig plt figure for c num in
  • std::sort 使用自定义比较器

    在下面的代码中 为什么这三个IntComparator IntComparator2 and IntComparator3作为第三个参数sort 功能 他们不会有不同的左值函数类型吗 基于https en cppreference com