dxf*_*ldu 5 c++ lambda comparator c++11
我有一个已经排序的向量,称为vec,还有一个目标变量。目标是返回最接近目标的向量元素。
我试图将C ++ 11 lambda函数与[=]一起使用以捕获外部变量
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> vec{1,2,3,4,5};
double target = 3.14159;
int res = min(vec.begin(), vec.end(), [=](int v1, int v2) -> bool {
return abs(v1-target) < abs(v2-target);
});
cout << res << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我希望得到res = 3,但是会返回错误:
error: cannot convert 'const __gnu_cxx::__normal_iterator<int*, std::vector<int> >' to 'int' in initialization
Run Code Online (Sandbox Code Playgroud)
您使用了错误的算法。std::min对按原样传递的两个特定对象进行操作,或对std::initializer_list. 对于容器,请std::min_element改用。它返回一个需要取消引用的迭代器。
auto res = std::min_element(vec.cbegin(), vec.cend(), [=](int v1, int v2) -> bool {
return abs(v1-target) < abs(v2-target);
});
// Make sure that the range wasn't empty, i.e. res != vec.cend()...
const int min = *res;
Run Code Online (Sandbox Code Playgroud)
请注意,您可能需要考虑通过显式捕获所需的对象来缩小 lambda 闭包的范围(在您的情况下毕竟只有一个)。并且还要考虑传递.cbegin()以及.cend()何时不修改有问题的容器。
| 归档时间: |
|
| 查看次数: |
115 次 |
| 最近记录: |