STD 算法如何处理 lambda 指针?

How do STD Algorithms handle the lambda pointer?

所以我正在使用这个小函数来打印矢量。 它有效,但我想了解它是如何工作的:

 void const print_vector(vector<int> const& v)
{
    std::for_each(v.begin(), v.end(), [](const int& n) {std::cout << n << " ";});
}

"n" 变量如何知道指向向量的元素?

也感谢任何进一步的更正

谢谢!

n 没有指向任何东西。该算法遍历容器并使用其中的每个元素(通过取消引用迭代器)作为 lambda 的参数。

https://en.cppreference.com/w/cpp/algorithm/for_each

您的代码等同于:

void const print_vector(vector<int> const& v)
{
    std::for_each(v.begin(), v.end(), foo);
}

void foo(const int& n) 
{ 
    std::cout << n << " "; 
}

您的 lambda 只是一种 shorthand 函数声明方式 foo

然后将foo的地址传入for_each

for_each循环遍历vector,每次调用foo,传入当前元素作为参数n.

(注意:它并不完全等价。lambda实际上是一个函子,而不是一个函数,但这只是混淆了事情并且在这里没有区别。)

How does the "n" variable know to point to the element of the vector?

n 只是仿函数的一个参数。它是一个引用,它指的是在调用仿函数时作为参数传递给仿函数的任何对象。 std::for_each 调用函子并传递参数。

std::for_each 另一方面知道 "point" 到元素,因为您将指向向量的开始和结束迭代器作为参数传递给它。 std::for_each 通过 begin 迭代器间接获取第一个元素,调用仿函数并将间接结果作为参数传递。然后 std::for_each 递增迭代器并重复,直到迭代整个范围。