[英]Iterative for loop and lambda function
我有以下代码:
#include <iostream>
#include <algorithm>
struct Point
{
int x, y;
Point(int x, int y): x(x), y(y) {}
};
int main()
{
Point arr[] = {
Point(4,2), Point(0,3), Point(1,2)
};
std::sort(arr, arr+sizeof(arr)/sizeof(Point), [](Point a, Point b){return a.x<b.x;});
return 0;
}
现在,我应该编写迭代的for循环(内置在cpp for_each循环中),该循环打印出数组的所有元素,其中,我们必须使用自动引用作为迭代变量。
现在,这让我有些困惑,因为我知道无需任何迭代变量或类似的东西就可以做到:
std::for_each(arr,arr + sizeof(arr)/sizeof(Point), [](Point a){cout<<a.x<<a.y<<std::endl;}
显然,这不是我要执行的操作,因此,由于我在处理for_each循环时从未发现自己使用迭代变量,因此我想找出我应该如何正确执行此操作,特别是考虑到我必须使用自动引用。 任何帮助表示赞赏!
您可能正在寻找range-for循环 :
for (auto & i : arr) {
std::cout << i.x << ',' << i.y << '\n';
}
如果您正在寻找基于std::for_each
的解决方案,则可以执行以下操作。
std::for_each(std::begin(arr), std::end(arr),
[](auto& p){ cout << p.x << p.y << "\n"; });
// ^^^^^ auto reference
在这里,您有一个要在每次迭代中进行处理的对象的auto&
引用(在上述情况下,使用const auto&
会很有意义)。
这几乎与@cdhowie建议的基于范围的for循环相同 。 这里唯一需要注意的有趣一点是, std::for_each
是为传递给STL算法的可调用对象一定不会产生副作用的规则的少数(唯一?)例外之一。 在这种情况下,写入全局std::cout
对象是一个副作用,而std::for_each
明确允许这样做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.