2012-07-30 156 views
1

我是新的董事会成员。我正在使用MS VS2008。 我正在学习列表的列表。 我正在尝试将元素添加到作为列表列表的一部分的列表中。C++:嵌套列表:如何将一个项目添加到列表列表

我在我的程序中注意到我遇到问题。 当我调试它时,“beth”被添加到第二个列表(division2),但是当循环退出时,即使我已经将所有列表声明在嵌套循环之外,“beth”也不在第二个列表中。

任何帮助将得到更大的赞赏。

下面是代码:

struct item 
{ 
string name; 
int age; 
}; 
int main() 
{ 
list<item> division1; 
list<item> division2; 

list< list<item> >WholeCompany; 

item s; 
s.name="sandra"; s.age=43; division1.push_back(s); 
s.name="Marc"; s.age=19; division2.push_back(s); 
s.name="betty"; s.age=34;division2.push_back(s); 

WholeCompany.push_back(division1); 
WholeCompany.push_back(division2); 

list< list<item> >::iterator WholCompIter; 
list<item>::iterator itemIter; 

for (WholCompIter = WholeCompany.begin(); WholCompIter != WholeCompany.end();  WholCompIter++) 
    { 
    //incorrect 
    //list<item> listEntry = *WholCompIter; 
    //instead use: 
    list<item> listEntry = *WholCompIter; 

    for (itemIter = listEntry.begin(); itemIter != listEntry.end(); itemIter++) 
    { 
     //MY ISSUE IS RIGHT HERE! How can I add the value to the list, but  the list forgets it when it exit loop 
     if(itemIter->name =="betty") 
     { 
      item s; s.name="beth"; s.age=65; 
      listEntry.insert(itemIter,s);//problem is here. 
          //I have also tried 
          //listEntry.push_back(s) but the output doesn't show it 

     } 
    } 
} 
    //incorrect. 
//for(list<item>::iterator i=division2.begin(); i!=division2.end();++i) 
// cout<<i->name<<" "<<i->age<<endl; 
    //instead use: 
    for (WholCompIter = WholeCompany.begin(); WholCompIter != WholeCompany.end(); WholCompIter++) 
{ 
    list<item>listEntry = *WholCompIter; 

    for (itemIter = listEntry.begin(); itemIter != listEntry.end(); itemIter++) 
    { 
    cout<<itemIter->name<<" "<<itemIter->age<<endl; 

    } 
    cout<<endl; cout<<endl; 
} 
return 0; 
} 
+1

除了本地列表变量的问题外,还要注意在迭代时修改列表可能会使迭代器失效。 – 2012-07-30 05:20:56

回答

2

你只是创建副本这里:

list<item> listEntry = *WholCompIter; 

相反,你需要一个参考:

list<item>& listEntry = *WholCompIter; 

A另外,您正在从底部的循环中打印division2。请记住,WholeCompany只是初始化时的division2的副本。由于您通过上述参考修改了WholeCompany,因此您需要在底部的输出循环中访问WholeCompany

+0

嗨克里斯,我改变了代码,我仍然得到相同的输出。我的名单WholeCompany似乎没有改变。还有其他建议吗?谢谢。 – user1561949 2012-07-30 05:31:26

+0

@ user1561949你把代码改成了什么?你能否更新你的问题来显示你的最新代码? (追加新代码,请勿覆盖原始代码。) – chrisaycock 2012-07-30 05:34:50

1

修复。

for (WholCompIter = WholeCompany.begin(); WholCompIter != WholeCompany.end();  WholCompIter++) 
    { 
    list<item>& listEntry = *WholCompIter; 

    for (itemIter = listEntry.begin(); itemIter != listEntry.end(); itemIter++) 
    { 
     //MY ISSUE IS RIGHT HERE! How can I add the value to the list, but  the list forgets it when it exit loop 
     if(itemIter->name =="betty") 
     { 
      item s; s.name="beth"; s.age=65; 
      listEntry.insert(itemIter,s);//problem is here. 
          //I have also tried 
          //listEntry.push_back(s) but the output doesn't show it 

     } 
    } 
} 

当你键入list<item> listEntry您创建本地变量,然后在你的代码通过list<list<item>>::iterator::operator *其分配给返回值的副本,当你改变它,还有你的list WholeCompany没什么效果。

在串

WholeCompany.push_back(division1); 
WholeCompany.push_back(division2); 

你推入wholeCompanydivision1division2,因此,当您更改包含WholeCompany,包含division1division2不会改变

+0

嗨,我已添加列表&listEntry = * WholCompIter;到我的代码,我仍然得到相同的输出:马克19,贝蒂34.我应该得到马克19,贝蒂34,贝斯65.任何想法,为什么我的代码仍然无法正常工作? – user1561949 2012-07-30 05:22:59

+0

@ user1561949是的。你推入载体 - 列表的副本,感觉WholeCompany。 – ForEveR 2012-07-30 05:29:08

+0

@ user1561949查看我更新的答案。你正在打印错误的列表。 – chrisaycock 2012-07-30 05:30:17

相关问题