首页 >后端开发 >C++ >如何为 std::set 容器定义自定义比较器?

如何为 std::set 容器定义自定义比较器?

Susan Sarandon
Susan Sarandon原创
2024-12-17 10:37:25811浏览

How to Define a Custom Comparator for the std::set Container?

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

简介:

在排序和搜索算法中,自定义比较器用于指定容器中元素的替代排序。这允许根据特定条件进行自定义排序或搜索。让我们探索如何为 std::set 容器定义自定义比较器。

案例研究:

考虑一组整数,您希望按字典顺序而不是数字排序订购。这意味着即使“10000”在数值上更大,元素“1234”和“10000”也应被视为按顺序(按字典顺序)。

错误和解决方案:

您遇到的错误是因为 g 期望一个符合特定模板参数列表的比较器,特别是“template类std::set”。在你的代码中,“lex_compare”不是一个可以履行 _Compare 作用的类型。

解决方案:

有几种方法可以为 std 定义自定义比较器::设置:

1。现代 C 20 解决方案:

在 C 20 及更高版本中,您可以直接使用 lambda 函数作为比较器:

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

2.现代 C 11 解决方案:

在 C 11 及更高版本中,您可以将 lambda 函数与 set 构造函数一起使用:

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

3。函数对象:

您可以使用返回布尔值的operator()函数定义函数对象:

struct Compare {
    bool operator()(const int &a, const int &b) { return a < b; }  // Arbitrary example
};

std::set<int, Compare> s;

4. std::integral_constant:

您可以使用 std::integral_constant 创建隐式转换为函数指针的类型:

#include <type_traits>

struct Compare {
    bool operator()(const int &a, const int &b) { return a < b; }  // Arbitrary example
};

using Cmp = std::integral_constant<decltype(&Compare::operator()), &Compare::operator()>;

std::set<int, Cmp> s;

结论:

通过定义自定义比较器,您可以更好地控制元素的顺序在您的集合中,让您实现特定的排序要求。

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

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