更改列表项
Change the list item
本文关键字:列表 更新时间:2023-10-16
对不起我的英语。
某些类别:
class Kid {
public:
...
string _name;
std::list<string> _cuteKids;
};
使用类别:
std::list<Kid> kids;
kids.push_back(new Kid("Jeck"));
kids.push_back(new Kid("Anna"));
kids.push_back(new Kid("Toma"));
for(auto e: kids) {
e._cuteKids.push_back("Jeck"); // Many some names...
[1]
}
[2]
如果查看调试器中的代码,则第1段中的列表_cuteKids-have项。但是,如果查看第2段中的列表_cuteKids,则没有项目。为什么?
这只是一个例子,实际上我有很多复杂的算法,但底线是在一个循环_cuteKids变空之后。就好像它是一个静态变量(e:kids),而不是指向kids变量的指针。
e
是列表项的副本,因此对它的更改不会影响列表中的项。
要做您想做的事,请将e
作为参考:
for (auto &e : kids)
在您的代码中:
for (auto e: kids) { e._cuteKids.push_back("Jeck"); // Many some names... }
您正在对kids
容器中的每个项执行复制,同时迭代容器本身,因为您错过了"简单"&
。
因此,语句e._cuteKids.push_back(...);
操作的是副本,而不是原始项上的。此本地副本在每次循环迭代后"蒸发",并且kids
容器中的原始项不受影响。
您必须使用引用(&
)对原始项进行正确迭代,以避免这些本地深度复制:
for (auto& e : kids) {
// ... do something on 'e' ...
}
请注意,有一个基于简洁范围的for
循环(N3994)的建议,它可能是该语言(C++17?)的下一次迭代的一部分,以避免类似代码中的错误:
基于范围的环路:下一代(修订版1)
使用这种新提出的语法,可以简单地写:
for (e : kids) {
// ... do something on 'e' ...
}
而不会引入诸如忘记CCD_ 9之类的细微错误。
相关文章:
- Pybind11:将元组列表从Python传递到C++
- 从链接列表c++中删除一个项目
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- C++如何通过用户输入删除列表元素
- 读取文件的最后一行并输入到链接列表时出错
- 复制列表初始化的隐式转换的等级是多少
- LNK2038、MSVS2017 MAGMA的原因列表
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 没有为自己的结构调用列表推回方法
- 使用简单类型列表实现的指数编译时间.为什么
- 一对向量构造函数:初始值设定项列表与显式构造
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 通过for循环使用用户输入填充列表
- C++:如何使函数只返回作为列表一部分的字符串
- 概念中的cv限定符需要表达式参数列表
- 下面是我为检测链接列表中的循环而制作的代码
- 建议在运行时将带有类实例的列表从c++导入qml
- 如何维护资源管理器项目视图中当前可见的项目列表
- 在卡萨布兰卡形成编码参数的列表
- 在没有参数列表的情况下使用模板名称"Event"无效,模板问题