首页 >后端开发 >C++ >如何使用自定义比较器自定义 std::set 中的比较标准?

如何使用自定义比较器自定义 std::set 中的比较标准?

Linda Hamilton
Linda Hamilton原创
2024-12-20 17:25:10686浏览

How to Customize the Comparison Criteria in a std::set Using Custom Comparators?

如何将自定义比较器与 std::set 一起使用

在本文中,我们提供了使用自定义比较器在 std::set 容器中自定义比较条件的解决方案.

std::set 是唯一元素的有序集合,默认情况下,它按升序对元素进行排序。然而,我们可能想要定义自己的比较逻辑来改变这种行为。让我们探讨以下自定义比较器可能有用的场景:

场景:自定义词典顺序

在提供的示例中,我们打算将 std::set 中整数的顺序更改为词典顺序而不是数字。我们定义一个自定义比较器函数 lex_compare,它将每个整数转换为字符串表示形式,然后比较字符串。但是,此代码无法编译。

解决方案

出现错误是因为提供的代码将自定义比较器函数 lex_compare 作为参数传递给 std::set 模板。但是, std::set 的第二个模板参数需要类型,而不是函数。为了解决这个问题,我们可以采用多种方法:

1.使用 Lambda 函数作为比较器:

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

在 C 20 及更高版本中,我们可以直接使用 lambda 函数作为比较器。 lambda 接受两个参数(可比较的元素)并返回一个布尔值,指示它们的顺序。

2.使用函数作为比较器:

bool cmp(int64_t a, int64_t b) { return a < b; }
std::set<int64_t, decltype(&cmp)> s(&cmp);

如果不首选 lambda 表达式,我们可以定义一个单独的布尔函数 cmp 并将其传递给 std::set 构造函数。请注意,在这种情况下,我们需要提供取址运算符 (&) 来传递对函数的引用。

3.使用带有函数调用运算符的结构体:

struct cmp {
    bool operator()(int64_t a, int64_t b) { return a < b; }
};

std::set<int64_t, cmp> s;

此方法定义带有实现比较逻辑的函数调用运算符的结构体。然后将该结构用作集合的比较器。

通过采用这些技术,我们可以有效地自定义 std::set 的排序行为以满足特定要求。

以上是如何使用自定义比较器自定义 std::set 中的比较标准?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn