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

2024-01-10

我正在尝试将一组整数中项目的默认顺序更改为字典顺序而不是数字顺序,但我无法使用 g++ 编译以下内容:

文件.cpp:

bool lex_compare(const int64_t &a, const int64_t &b) 
{
    stringstream s1,s2;
    s1 << a;
    s2 << b;
    return s1.str() < s2.str();
}

void foo()
{
    set<int64_t, lex_compare> s;
    s.insert(1);
    ...
}

我收到以下错误:

error: type/value mismatch at argument 2 in template parameter list for ‘template<class _Key, class _Compare, class _Alloc> class std::set’
error:   expected a type, got ‘lex_compare’

我究竟做错了什么?


1. 现代C++20解决方案

auto cmp = [](int a, int b) { return ... };
std::set<int, decltype(cmp)> s;

We use 拉姆达函数 https://stackoverflow.com/q/7627098/5812238作为比较器。像往常一样,比较器应该返回布尔值,指示作为第一个参数传递的元素是否被认为位于特定的第二个参数之前严格弱序 https://en.wikipedia.org/wiki/Weak_ordering#Strict_weak_orderings它定义了。

在线演示 https://godbolt.org/z/AL2wo-

2. 现代C++11解决方案

auto cmp = [](int a, int b) { return ... };
std::set<int, decltype(cmp)> s(cmp);

在 C++20 之前,我们需要将 lambda 作为参数传递给 set 构造函数

在线演示 https://ideone.com/WAu8EU

3. 与第一个解决方案类似,但用函数代替 lambda

使比较器像平常的布尔函数一样

bool cmp(int a, int b) {
    return ...;
}

然后使用它,可以这样:

std::set<int, decltype(cmp)*> s(cmp);

在线演示 https://ideone.com/LhYOvK

或者这样:

std::set<int, decltype(&cmp)> s(&cmp);

在线演示 https://ideone.com/tBwrUI

4.使用struct with的旧解决方案()操作员

struct cmp {
    bool operator() (int a, int b) const {
        return ...
    }
};

// ...
// later
std::set<int, cmp> s;

在线演示 https://ideone.com/M6azNB

5.替代解决方案:从布尔函数创建结构

取布尔函数

bool cmp(int a, int b) {
    return ...;
}

并使用它来构造结构std::integral_constant https://en.cppreference.com/w/cpp/types/integral_constant

#include <type_traits>
using Cmp = std::integral_constant<decltype(&cmp), &cmp>;

最后,使用结构体作为比较器

std::set<X, Cmp> set;

在线演示 https://ideone.com/jxUPkX

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

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

  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • 在Android Studio gradle项目中使用NDK和STL

    我在将 stlport 链接到 Android Studio 中的 gradle 项目时遇到问题 使用 NDK 的 Eclipse Android 项目迁移到 Android Studio 该项目使用 STL 我有包含内容的 android
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l

随机推荐

  • std::enable_if 或 SFINAE 用于迭代器或指针

    我想写一个构造函数MyClass需要一个参数 我希望只有当参数是一个时才编译pointer or an iterator 有的东西iterator traits 如何实现这一目标 遗憾的是 没有标准的方法来检测一个类是否模型Iterator
  • 在 VS C++ 6.0 中,什么调试工具可以很好地查找内存泄漏的位置?

    我的程序最终消耗了所有内存并崩溃 浏览代码 我找不到任何突出的东西可以做到这一点 您可以修改代码以使用调试版本吗malloc and free 如果是 请检查 malloc dbg http msdn microsoft com en us
  • 将 .cache 文件夹文件路径从绝对路径更改为相对路径。是否可以?

    来自我之前的问题AWS Amplify 控制台中的 Gatsby cache 文件夹 https stackoverflow com questions 57025169 gatsby cache folder in aws amplify
  • 如何用 cabal 建立一个独立的库?

    我有一个库 它依赖于其他一些库 当然还有 haskell 运行时 它导出 C API 我想以一种完全独立的方式构建它 并且用户不会为安装 haskell cabal 和所有依赖项而烦恼 它是完全独立的 用户不会为安装 haskell cab
  • JAVA日期格式“dd/MM/yyyy”和“dd/mm/yyyy”有什么区别? [复制]

    这个问题在这里已经有答案了 在为 java 项目编写代码时 我使用了日期格式 日 月 年 但另一位为同一个项目编写代码的同事使用了 日 月 年 发生格式和不匹配 我还观察到数据库日期格式可以很好地工作 日 月 年 不与 日 月 年 所以我需
  • libpcap:pcap_breakloop() 导致内存泄漏

    使用 Linux 时pthreads and libpcap我在使用时注意到一些奇怪的行为pcap breakloop 我的目标如下 打开一个将运行的新线程pcap loop并处理捕获的数据包 而主线程将执行其他操作 当收到信号 SIGIN
  • GIDSignIn 设置approval_prompt

    问题在于 Google 仅在用户注销应用程序并重新登录后才要求离线访问 Reading this http www riskcompletefailure com 2013 12 are you using approvalpromptfo
  • C 包括防护[重复]

    这个问题在这里已经有答案了 When file1 c包括inc h 包含包含守卫 ifndef INC H 第一次 define INC H被执行 但现在 当另一个file2 c包括相同的inc h 是宏INC H已经定义了 都是同一个故事
  • Linq:选择属性集合

    我有两节课 public class Person public int Id get set public string Name get set public List
  • 是什么原因导致错误“_pickle.UnpicklingError:无效的加载密钥,''。”?

    我正在尝试在数组中存储 5000 个数据元素 这 5000 个元素存储在现有文件中 因此它不为空 但我收到错误 IN def array name puntos df4 m open name rb v 5000 m seek 5000 i
  • “NoneType”对象没有属性“remove_roles”Discord.py

    Keep getting an error for the reaction remove just copy pasted my whole code minus the client id cause it might help I h
  • 为什么我的 Promise 数组在调用 Promise.all() 之前运行?

    我正在尝试创建 Promise 数组 然后使用 Promise all 解析它们 我正在使用 got 它返回一个承诺 我的代码可以工作 但我不完全理解如何工作 这里是 const got require got const url myUr
  • 在 AngularJS 中执行 ng-repeat 内的函数

    我想在 ng repeat 中执行一个函数来检索一些其他数据来显示 例如 我有一份公寓列表 我使用以下方式显示此列表ng repeat 比我想向业主展示的每套公寓 这不是u Apartments So my getInq函数调用服务来获取指
  • Android 驱动程序 JDBC PostgreSQL [重复]

    这个问题在这里已经有答案了 我正在尝试使用 JDBC 驱动程序将我的 Android 应用程序连接到服务器 PostgreSQL 但出现以下错误 java lang ClassNotFoundException org postgresql
  • python 和 networkX keyerror

    我在 python 中遇到这个问题 python 不断给我一个关键错误 重量 g add edge 1 3 weight 2 5 g 1 2 weight 1 5 for n1 n2 attr in g edges data True pr
  • 将 PILLOW 图像转换为 StringIO

    我正在编写一个程序 它可以接收各种常见图像格式的图像 但需要以一种一致的格式检查它们 什么图像格式并不重要 主要是它们都是相同的 由于我需要转换图像格式然后继续处理图像 因此我不想将其保存到磁盘 只需转换它并继续 这是我使用 StringI
  • 编写一个简单的 cron 作业来运行 Java 类

    如何从头开始编写一个 cron 作业来运行 java 类 或者编写一个嵌入 Java 代码来运行的 cron 作业类 以及如何设置计时器每隔一分钟 例如 运行该 cron 作业 注意 完全是 Linux 初学者 这是运行测试作业的示例 sh
  • JNA:结构类中 getFieldOrder() 的用途是什么

    我正在尝试调用 dll 文件中存在的 C 函数 C 函数通过引用将结构对象作为参数 并且函数将在该函数中赋值 因此 在我的 java 应用程序中 为了将结构对象传递给函数 我确实这样写 interface SomeInterface ext
  • 应用顺序/按值调用和正常顺序/按名称调用差异

    背景 我正在根据在线课程学习 sicp 并对其讲义感到困惑 在讲义中 应用顺序似乎等于 cbv 正常顺序等于 cbn 困惑 But the wiki http en wikipedia org wiki Evaluation strateg
  • 使用自定义 std::set 比较器

    我正在尝试将一组整数中项目的默认顺序更改为字典顺序而不是数字顺序 但我无法使用 g 编译以下内容 文件 cpp bool lex compare const int64 t a const int64 t b stringstream s1