我正在尝试这样的事情来使用字符串的向量列表来预填充地图。代码是不言自明的:
Constructor(const vector<string>& names) {
for_each(names.begin(), names.end(),
[this, counter = 1](const String& choice) mutable {
nameMapping.emplace(choice, counter++);
}
);
}
Run Code Online (Sandbox Code Playgroud)
我没有真正理解的是如何counter工作?
仅供参考:counter在 lambda 函数之外无处声明。
但是,我能够在类范围中创建一个局部变量并在可变的 lambda fn 中修改它吗?
有人可以帮助我了解发生了什么。
当您设置时,counter = 1您将声明一个新的临时值counter等于 1。编译器完成确定类型的工作。int默认情况下,这个临时对象被推导为类型,并在 lambda 存在时存在。
通过设置,mutable您可以修改counter和this
旁白:由于您似乎正在插入地图/无序地图,因此您最好使用以下内容:
#include <algorithm> // For transform
#include <iterator> // For inserter
Constructor(const vector<string>& names) {
auto const example = [counter = 1](const string& item) mutable {
return {item, counter++};
};
std::transform(names.begin(), names.end(),
std::inserter(nameMapping, nameMapping.end()), example);
}
Run Code Online (Sandbox Code Playgroud)
通过将 nameMapping 调用移到 lambda 之外,您不必将自己与范围内的内容和范围外的内容混淆。
此外,您可以避免不必要的捕获,以及将来可能使您或其他读者感到困惑的任何其他内容。
| 归档时间: |
|
| 查看次数: |
226 次 |
| 最近记录: |