[英]How to use STL map?
我有一個私人領域
std::map<std::string, std::multiset<GraphObject*>>* the_Map;
如何為它分配內存並插入GraphObject? 我必須使用新的運營商嗎?
the_Map = new map<string,multiset<GraphObject*>>;
我如何插入新的GraphObject? 它是數據結構的一部分,我真的需要一個指向地圖的指針。
你為什么要存儲::std:multiset
GraphObject *
的::std:multiset
有點模糊,但讓我們滾動它。
這是一個很簡單的文檔回答,但StackOverflow毫無疑問,所以......
the_Map = new map<string,multiset<GraphObject*>>;
這確實是你為地圖分配內存的方式。 對於周圍存在的東西只是指點一下通常不是一個好主意,但你堅持,這就是你如何做到的。 這意味着您必須記住在某些時候delete
它。 而且你必須確保持有指針的類的復制結構做正確的事(並說正確的事情會相當復雜)。
你現在有一個有趣的問題。 您正在每個映射條目中存儲multiset
。 幸運的是,當訪問以前未知的密鑰時,將自動創建並初始化此多集。 OTOH,你使用裸指針意味着你有一個異常安全問題。 如果在路上的任何地方拋出異常,則可能泄漏內存。 所以你必須捕獲任何異常並清理你的對象:
GraphObject *tmp = new GraphObject;
try {
(*the_Map)[key].insert(tmp);
} catch (...) {
delete tmp;
throw;
}
你的問題是如此基本的事實讓我質疑你需要使用指針的斷言。 我真的不知道你會不會寧願一個multimap
,而不是map
從string
- > multiset
。 但是,您堅持數據結構的一般形式。 所以上面就是你如何使用它。
我還要說這個數據結構大量使用裸指針是一個非常糟糕的主意。 你必須編寫一個非常復雜的函數來正確地解構或復制整個混亂。
編輯 : 嘆息編碼在凌晨4點的數據結構我永遠不會創建自己導致我寫一些非常愚蠢的代碼。 目前的版本要好得多。 雖然這個答案真的比我的好多了。
如何為它分配內存並插入GraphObject?
它根本不想成為一個指針; 只需使地圖本身成為類的成員,內存分配將自動發生。
正確地插入一個對象是相當繁瑣的,因為你也在那里存儲指針。 如果它不需要是指針,那么存儲對象將使您的生活更輕松。 如果它確實必須是一個指針(例如因為GraphObject
是一個多態基類),我建議存儲智能指針: std::unique_ptr
,或std::tr1::shared_ptr
或boost::shared_ptr
如果你被卡住了以往。
如果你確實需要使用原始指針來解決一些瘋狂的原因,那么最接近異常安全插入的可能就是:
GraphObject * object = new Whatever(...);
try {
the_Map[key].insert(object);
} catch(...) {
delete object;
throw;
}
或者如果您不關心插入失敗時內存泄漏的可能性:
the_Map[key].insert(new Whatever(...));
另外,不要忘記刪除每個對象時刪除它們; 這不會自動發生。
我真的需要一個指向地圖的指針。
不,你沒有。 但如果你真的相信你這樣做,並且想要忽略每個人的建議,那么你需要一個實際的地圖指向。 我建議您將此映射作為該類的成員,以便自動管理其生命周期。
如果你真的想讓維護代碼的人生活困難,那么我想你可以用new
分配一個。 在這種情況下,請記住在完成后刪除它; 可能在類析構函數中。 如果你這樣做,請記住Rule of Three並實現或刪除復制構造函數和復制賦值運算符,因為默認實現將執行錯誤的操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.