Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 更改列表项_C++_List_Foreach_Containers_Std - Fatal编程技术网

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' ...
}