C ++ Lambda函数-与目标相比如何返回最接近的向量元素

dxf*_*ldu 5 c++ lambda comparator c++11

我有一个已经排序的向量,称为ve​​c,还有一个目标变量。目标是返回最接近目标的向量元素。

我试图将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)

lub*_*bgr 4

您使用了错误的算法。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()何时不修改有问题的容器。

  • 另请注意,这不使用范围的排序性(即,该解决方案是“O(n)”而不是“O(log(n))”)。我并不认为性能差异很重要,但我发现它值得注意。 (4认同)