c++ - range::lower_bound 对比较的要求是否与 std::lower_bound 不同?
问题描述
似乎在 C++20 中使用与 std::lower_bound() 正常工作的相同比较函子不适用于 std::ranges::lower_bound() 。以下代码不能与 Visual Studio 16.10.2(和 /std::c++latest)或 gcc 11.1 一起编译。我可以通过使用投影而不是比较函子来解决这个问题,但这会增加迁移的工作量。
std::ranges::lower_bound() 中参数“comp”的要求是否与 std::lower_bound() 不同,如果是,如何?
#include <algorithm>
#include <vector>
struct A {
double m_value;
};
struct MyComparison {
bool operator()(const A& a, const double& b) {
return a.m_value < b;
}
};
void f() {
std::vector<A> v = {A{1.0}, A{2.0}, A{3.0}};
// comparison functor without ranges compiles as expected:
auto x = std::lower_bound(v.cbegin(), v.cend(), 2.0, MyComparison());
// projection with ranges compiles as expected:
auto y = std::ranges::lower_bound(v, 2.0, {}, &A::m_value);
// comparison functor with ranges fails to compile:
auto z = std::ranges::lower_bound(v, 2.0, MyComparison());
}
Visual Studio 中的错误消息:
错误 C2672:'operator __surrogate_func':未找到匹配的重载函数
错误 C7602:'std::ranges::_Lower_bound_fn::operator ()':不满足关联的约束
解决方案
是的。
std::ranges::lower_bound
的Comp
必须是
std::indirect_strict_weak_order<const double*, std::vector<A>::iterator>
它扩展到很多变化
std::strict_weak_order<Comp&, const double&, A&>
扩展到
std::predicate<Comp&, const double&, const double&> &&
std::predicate<Comp&, const double&, A&> &&
std::predicate<Comp&, A&, const double&> &&
std::predicate<Comp&, A&, A&>
所以你需要能够处理参数类型的每一个排列。
std::lower_bound
'sComp
只需要是Compare,这对(A&, const double&)
表单很好。
推荐阅读
- python - 如何在 Windows 中使用 Python 打印彩色文本
- javascript - 如何使用更少的行来使用一些 jQuery id?
- python - 如何在pygame中将文本从矩形下方移动到矩形上方?
- c# - 在面板中动态排列对象
- javascript - 在 Angular 的模态窗口之外启用诸如单击、选择等操作
- hive - COUNT(*) 在配置单元中返回多行而不是一
- scala - 是否可以生成一个嵌入了 Scala 运行时的可移植 Scala JAR 文件?
- search - 如何使用 DSE 搜索 6.8 创建搜索索引
- java - 特定代码中的构建器与工厂设计模式
- python - 如何从 pandas DataFrame 中选择多个单元格?