2013-07-30 50 views
1

我在C++編程中很新,並且有一些問題。在std :: list中保存std :: set

我有一套:

std::set<Proc*> finalProc = getFinalProc(); 

我只是想從這個集合中的所有元素複製到列表中。我以爲我必須遍歷集合並將元素保存在列表中?我想我犯了一個大錯,但我不能找到一個解決方案:

std::list<Proc*> firstLevel; 
for(std::set<Processor*>::iterator it = endProcessors.begin(); it != endProcessors.end(); ++it){ 
    firstLevel.push_back(????); 
} 

想法是,所有的push_back迭代元素?

感謝

+0

你已經顯示了更好的方式來做到這一點,但只是爲了完整性,你會用'* it'來代替'????'。 'it'有點像一個指針,所以'*'「對其進行」引用「,並獲取值,然後將它推入'list'中。 – BoBTFish

回答

7

有一種更好的方法來做到這一點:

std::list<Proc*> firstLevel(finalProc.begin(), finalProc.end()); 

在你原來的代碼,你應該已經取代????*itendProcessorsfinalProc

正如@ luk32筆記,可能你有一個bug(如果你想複製實際的數據,而不是指針)。在這種情況下,你可以看到@ luk32溶液或我會去std::unique_ptr這裏(智能指針是在現代C來管理內存的優選方式++):

std::list<std::unique_ptr<Proc>> firstLevel; 
for(const auto& ptr: finalProc){ 
    firstLevel.push_back(std::make_unique<Proc>(*ptr)); 
} 

通過指針在firstLevel指出所有的內存會自動後釋放能見度範圍內的firstLevel

+1

這麼該死的簡單...謝謝。迭代器的push_back有什麼錯誤的想法? – user2633791

+0

沒有錯,但此代碼更短。 – Seagull

+1

我看到一個錯誤傳入。請注意,他存儲了指向'Proc'的指針。您將製作這些參考文件的副本。不知道這是否是有意的。 – luk32

1

編輯:我知道,在回答這個答案後沒有幫助OP,但是一開始並不清楚。因此,我想離開它,如果有人來過這裏,想要一種方式來複制實際的物體。只是爲了完整性。

如果你想複製指向Proc對象的指針,請爲sashas答案。

但是,如果要製作在集合中保存的實際對象的副本,則需要明確地複製它們。

std::list<Proc*> firstLevel; 
for(std::set<Processor*>::iterator it = endProcessors.begin(); it != endProcessors.end(); ++it){ 
    firstLevel.push_back(new Proc(**it)); //1 
} 

[1]提領迭代器,解引用指針來獲得實際的對象,然後從中作出新Proc對象,並從新推指針到列表中。

我看到已經downvotes,所以也許我會嘗試闡述。

如果您僅複製引用 - 指針。然後修改列表中的東西將反映在集合的項目上,反之亦然,因爲它們存儲Proc*。如果意圖是複製實際的Proc對象。發佈的代碼做到了。

編輯: 反映評論。

當然,重要的是要記住,當你存儲指針時,當容器被破壞時,只有它的元素被調用。在這種情況下,這將是Proc*。我的意思是隻有指針會丟失。如果我們在創建矢量時對元素進行了明確的複製,當然我們需要明確地迭代並在每個元素上使用delete以正確釋放內存。另一種方法是使用智能指針,但最初的例子沒有,所以我也把它留下了。

+0

謝謝。指針副本就好了。但我會牢記這一點。謝謝 – user2633791

+0

@sasha哈哈,好吧,我完全理解,但像這樣的評論會很好。然而,同樣的問題依然存在,在你的回答中,我認爲更危險的是,因爲這些元素只需要被刪除一次。人們需要關心到哪裏去做。特別是如果你有多個指向同一元素的指針副本。 – luk32

+0

@ luk32,在我的情況下,一切都很好,因爲我做了一個副本。 ''unique_ptr'稍後會自動刪除它。 –

相關問題