使用自定义比较器编译集
尝试创建一组按字典比较而不是数字排序的整数时,编译时可能会出现问题with g .
遇到的错误是由于集合的模板参数类型不正确造成的。在提供的代码中:
set<int64_t, lex_compare> s;
lex_compare 不是类型而是函数。为了解决这个问题,我们需要根据 C 的模板要求创建一个比较器对象。
现代 C 解决方案
1. C 20 解决方案:
auto cmp = [](int64_t a, int64_t b) { return ... }; std::set<int64_t, decltype(cmp)> s;
Lambda 可以用作 C 20 中的比较器。lambda 应返回一个布尔值,指示元素的顺序。
2 。 C 11 解决方案:
auto cmp = [](int64_t a, int64_t b) { return ... }; std::set<int64_t, decltype(cmp)> s(cmp);
在 C 11 中,lambda 必须作为参数传递给集合构造函数。
传统解决方案
3。函数指针:
bool cmp(int64_t a, int64_t b) { return ...; } std::set<int64_t, decltype(cmp)*> s(cmp);
4.使用 Operator() 进行结构:
struct cmp { bool operator() (int64_t a, int64_t b) const { return ... } }; std::set<int64_t, cmp> s;
5.布尔函数的结构:
bool cmp(int64_t a, int64_t b) { return ...; } #include <type_traits> using Cmp = std::integral_constant<decltype(&cmp), &cmp>; std::set<int64_t, Cmp> set;
以上是如何在 C 中正确编译带有自定义比较器的集合?的详细内容。更多信息请关注PHP中文网其他相关文章!