2012-07-30 196 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

相關問題