我正在学习C++,并尝试实现一个二分查找函数,以找到满足谓词条件的第一个元素。该函数的第一个参数是一个向量,第二个参数是一个用于评估给定元素的谓词的函数。二分查找函数如下:
template <typename T> int binsearch(const std::vector<T> &ts, bool (*predicate)(T)) {
...
}
如果按照以下方式使用,它将按预期工作:
bool gte(int x) {
return x >= 5;
}
int main(int argc, char** argv) {
std::vector<int> a = {1, 2, 3};
binsearch(a, gte);
return 0;
}
但是如果我将lambda函数用作谓词,就会出现编译错误:
search-for-a-range.cpp:20:5: error: no matching function for call to 'binsearch'
binsearch(a, [](int e) -> bool { return e >= 5; });
^~~~~~~~~
search-for-a-range.cpp:6:27: note: candidate template ignored: could not match 'bool (*)(T)' against '(lambda at
search-for-a-range.cpp:20:18)'
template <typename T> int binsearch(const std::vector<T> &ts,
^
1 error generated.
上述错误由以下生成
binsearch(a, [](int e) -> bool { return e >= 5; });
怎么了?为什么编译器不相信我的lambda有正确的类型?
std::lower_bound
(你正在重新实现它)采用了一对迭代器而不是容器作为其参数。这使得它能够与任何类型的容器一起工作,或者容器的子集,甚至是标准库设计者尚未考虑过的范围。当你让你的代码在std::vector
上工作后,我强烈建议你朝着这个方向使它更加通用;我保证你会学到一些东西! - Toby Speightstd::find_if()
,而不是std::lower_bound()
。两者都很有教育意义,自己实现也是很好的练习,所以其他部分仍然适用。 - Toby Speight