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 的参数。
您的代码等同于:
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
递增迭代器并重复,直到迭代整个范围。
所以我正在使用这个小函数来打印矢量。 它有效,但我想了解它是如何工作的:
void const print_vector(vector<int> const& v)
{
std::for_each(v.begin(), v.end(), [](const int& n) {std::cout << n << " ";});
}
"n" 变量如何知道指向向量的元素?
也感谢任何进一步的更正
谢谢!
n
没有指向任何东西。该算法遍历容器并使用其中的每个元素(通过取消引用迭代器)作为 lambda 的参数。
您的代码等同于:
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
递增迭代器并重复,直到迭代整个范围。