如何从 C++11 匿名函数内部访问局部变量?
我正在对向量(权重)进行简单的归一化,尝试利用 STL 算法使代码尽可能干净(我意识到这对于 for 循环来说非常简单):
float tot = std::accumulate(weights.begin(), weights.end(), 0.0);
std::transform(weights.begin(), weights.end(), [](float x)->float{return(x/tot);});
目前, tot 对匿名函数,因此无法编译。使局部变量对匿名函数可见的最佳方法是什么?
I'm doing a simple normalization on a vector (weights), trying to make use of STL algorithms to make the code as clean as possible (I realize this is pretty trivial with for loops):
float tot = std::accumulate(weights.begin(), weights.end(), 0.0);
std::transform(weights.begin(), weights.end(), [](float x)->float{return(x/tot);});
At present, tot is not visible to the anonymous function, so this doesn't compile. What's the best way of making a local variable visible to the anonymous function?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
你需要一个关闭。
在这种情况下,
tot
是按值捕获的。 C++11 lambda 支持通过以下方式捕获:[x]
[&x]
[&]
当前作用域中的任何变量>[=]
您可以将以上任何内容混合在逗号分隔列表
[x, &y]
中。You need a closure.
In this case
tot
is captured by value. C++11 lambdas support capturing by:[x]
[&x]
[&]
[=]
You can mix any of the above in a comma separated list
[x, &y]
.lambda 可以从环境范围“捕获”变量:
您可以按值或按引用捕获,并且可以使用特殊语法
[=]
和[&]
从环境范围捕获任何东西,即你实际最终使用的任何东西。The lambda can "capture" variables from the ambient scope:
You can capture by value or by reference, and you can use the special syntax
[=]
and[&]
to capture anything from the ambient scope, i.e. anything you actually end up using.您需要将
tot
添加到“捕获列表”:或者您可以使用 capture-default 隐式捕获
tot
:You need to add
tot
to the "capture list":Alternatively you can use a capture-default to capture
tot
implicitly: