C++ 更改列表项
对不起我的英语 某些类别:C++ 更改列表项,c++,list,foreach,containers,std,C++,List,Foreach,Containers,Std,对不起我的英语 某些类别: class Kid { public: ... string _name; std::list<string> _cuteKids; }; 班童{ 公众: ... 字符串\u名称; 标准::列表cuteKids; }; 使用类别: std::list<Kid> kids; kids.push_back(new Kid("Jeck")); kids.push_back(new Kid("Anna
class Kid {
public:
...
string _name;
std::list<string> _cuteKids;
};
班童{
公众:
...
字符串\u名称;
标准::列表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]
std::列出孩子;
孩子们。推回(新孩子(“杰克”);
孩子们。推回(新孩子(“安娜”);
孩子们。推回(新孩子(“托玛”);
适用于(汽车e:儿童){
e、 _cuteKids.push_back(“Jeck”)//许多名字。。。
[1]
}
[2]
如果查看调试器中的代码,则第1段中的列表将包含一项。但是,如果查看第2段中的列表,则没有项目。为什么?
这只是一个例子,实际上我知道算法非常复杂,但底线是循环\u cuteKids变为空后。就好像它是一个静态变量(e:kids),而不是指向kids
e
的变量的指针是列表项的副本,因此对它的更改不会影响列表中的项
要执行所需操作,请将e
作为参考:
for (auto &e : kids)
在代码中:
您正在对kids
容器中的每个项目进行复制,同时迭代容器本身,因为您错过了一个“简单的”&
因此,语句e.\u cuteKids.push_back(…)代码>在副本上运行,而不是在原始项目上运行。此本地副本在每次循环迭代后“蒸发”,并且kids
容器中的原始项不受影响
您必须使用引用(&
)正确迭代原始项,以避免这些本地深度副本:
for (auto& e : kids) {
// ... do something on 'e' ...
}
注意,对于
循环(N3994),有一个基于简洁范围的的建议,这可能是该语言下一次迭代(C++17?)的一部分,以避免代码中的错误:
使用这种新提出的语法,可以简单地编写:
for (e : kids) {
// ... do something on 'e' ...
}
在不引入诸如忘记&
之类的细微错误的情况下,为什么孩子
会包含“可爱的孩子”列表?孩子就是孩子。一个孩子不包含其他孩子。这毫无意义。你也有间接层次的问题。给定std::列出孩子
,kids.push_back(new kid(“xxx”);
无法编译--new
给出了一个指针,但您试图插入该指针作为它所指向的对象。奇怪的是,您有std::list kids;
然后使用new
:kids.push_back(new kid(“Jeck”))
。cuteKids-是一个爱这个孩子的孩子的列表。这份工作不会改变孩子的性格。
for (e : kids) {
// ... do something on 'e' ...
}