擦除不是在std :: for_each中调用,而是在基于范围的for循环中执行?

use*_*973 0 c++ c++11

运行代码:

for (auto& v : vec)
    v.erase(0, v.find("\n") + 1);
Run Code Online (Sandbox Code Playgroud)

做了什么:擦除所有内容直到第一个"\n"中的每个元素vec.

但是,运行代码:

std::for_each(vec.begin(), vec.end(), [&](std::string v) {
    v.erase(0, v.find("\n") + 1);
});
Run Code Online (Sandbox Code Playgroud)

不删除任何元素vec.使lambda按值传递而不是-reference不会改变结果.

Gri*_*wes 5

std::for_each(vec.begin(), vec.end(), [&](std::string v) {
                                          ^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

你是按价值来论证的.您稍后只处理副本,与容器中的原始对象无关.将lambda的参数更改为引用.同时删除捕获列表(因为您没有从当前范围捕获任何内容!).

Lambda的捕获列表和参数列表是两种不同的野兽.捕获当前范围的变量与通过lambda获取参数无关operator().