使用自定义 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 比较器 的相关文章

  • 无法使用 strptime() 获取秒数

    我收到 YYYY MM DDThh mm ss S Z hh mm 这种格式的日期时间 我正在尝试使用复制该值strptime如下所示 struct tm time 0 char pEnd strptime datetime Y m dT
  • 在 LINQ 查询中返回不带时间的日期

    我正在编写一个查询 我想计算按日期联系我们的呼叫中心的次数 看起来很简单 但由于联系日期字段是日期时间字段 我得到了时间 因此当我按联系日期 时间 分组时 每个联系日期实例的计数为 1 所以 我想只按日期分组 而不按时间分组 下面是我用来查
  • 创建 DirectoryEntry 实例以供测试使用

    我正在尝试创建 DirectoryEntry 的实例 以便可以使用它来测试将传递 DirectoryEntry 的一些代码 然而 尽管进行了很多尝试 我还是找不到实例化 DE 并初始化它的 PropertyCollection 的方法 我有
  • 模板类的不明确多重继承

    我有一个真实的情况 可以总结为以下示例 template lt typename ListenerType gt struct Notifier void add listener ListenerType struct TimeListe
  • C++ 求二维数组每一行的最大值

    我已经设法用这个找到我的二维数组的每一行的最小值 void findLowest int A Cm int n int m int min A 0 0 for int i 0 i lt n i for int j 0 j lt m j if
  • 如何在C++中实现模板类协变?

    是否可以以这样一种方式实现类模板 如果模板参数相关 一个对象可以转换为另一个对象 这是一个展示这个想法的例子 当然它不会编译 struct Base struct Derived Base template
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • Cygwin 下使用 CMake 编译库

    我一直在尝试使用 CMake 来编译 TinyXML 作为一种迷你项目 尝试学习 CMake 作为补充 我试图将其编译成动态库并自行安装 以便它可以工作 到目前为止 我已经设法编译和安装它 但它编译成 dll 和 dll a 让它工作的唯一
  • 为什么 POSIX 允许在只读模式下超出现有文件结尾 (fseek) 进行搜索

    为什么寻找文件结尾很有用 为什么 POSIX 让我们像示例中那样在以只读方式打开的文件中进行查找 c http en cppreference com w c io fseek http en cppreference com w c io
  • 使用 C# 在 WinRT 中获取可用磁盘空间

    DllImport kernel32 dll SetLastError true static extern bool GetDiskFreeSpaceEx string lpDirectoryName out ulong lpFreeBy
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • c# Asp.NET MVC 使用FileStreamResult下载excel文件

    我需要构建一个方法 它将接收模型 从中构建excel 构建和接收部分完成没有问题 然后使用内存流导出 让用户下载它 不将其保存在服务器上 我是 ASP NET 和 MVC 的新手 所以我找到了指南并将其构建为教程项目 public File
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但

随机推荐

  • 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