gpt4 book ai didi

c++ - 与 std::lower_bound 相比,ranges::lower_bound 是否有不同的比较要求?

转载 作者:行者123 更新时间:2023-12-04 11:29:40 27 4
gpt4 key购买 nike

似乎在 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:“运算符 __surrogate_func”:找不到匹配的重载函数
错误 C7602:“std::ranges::_Lower_bound_fn::operator ()”:不满足关联的约束

最佳答案

是的。std::ranges::lower_boundComp必须是

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_boundComp只需要比较,就可以了 (A&, const double&)形式。

关于c++ - 与 std::lower_bound 相比,ranges::lower_bound 是否有不同的比较要求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68175176/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com