![](/img/trans.png)
[英]Getting index of the current element in custom comparator function for `std::upper_bound`
[英]search upper_bound by function of element
假设 a 有一个可以计算为整数的A
类。
我们得到一个A
的向量作为输入,该向量按它的evaluate()
值排序。
如何找到评估值的上限?
我试过这个,但它不能编译。
class A;
int evaluate(const A& a);
// ...
vector<A>::iterator foo(vector<A>& v, int k)
{
return upper_bound(v.begin(), v.end(), k,
[](const A& a, int k)
{
return evaluate(a) < k;
}
);
}
虽然其他用户已经正确地指出了这个问题(例如@StoryTeller 的“你把 lambda 中的参数顺序弄错了”),但请允许我放下一段在我的机器上编译的代码,供其他观众参考.
#include <algorithm>
#include <iostream>
#include <vector>
class A
{
public:
int data;
A(int data) : data(data) {}
};
int evaluate(const A & a)
{
return a.data;
}
std::vector<A>::iterator foo(std::vector<A> & v, int k)
{
return std::upper_bound(v.begin(), v.end(), k,
[](int k, A & a) { return evaluate(a) > k; }); // first argument always val
}
int main()
{
std::vector<A> vec {36, 42, 57};
std::cout << foo(vec, 42) - vec.begin() << std::endl; // 2
}
根据 C++17 标准中的[upper.bound]
:
... 以下相应条件成立: ... 或
comp(value, *j) == false
。
这意味着您将调用comp
(您的谓词),第一个参数是您传递的value
; 第二个参数是解引用的迭代器。
换句话说,您可能希望谓词具有以下类型:
bool (int, const A&)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.