簡體   English   中英

如何使用STL地圖?

[英]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 ,而不是mapstring - > multiset 但是,您堅持數據結構的一般形式。 所以上面就是你如何使用它。

我還要說這個數據結構大量使用裸指針是一個非常糟糕的主意。 你必須編寫一個非常復雜的函數來正確地解構或復制整個混亂。

編輯嘆息編碼在凌晨4點的數據結構我永遠不會創建自己導致我寫一些非常愚蠢的代碼。 目前的版本要好得多。 雖然這個答案真的比我的好多了。

如何為它分配內存並插入GraphObject?

它根本不想成為一個指針; 只需使地圖本身成為類的成員,內存分配將自動發生。

正確地插入一個對象是相當繁瑣的,因為你也在那里存儲指針。 如果它不需要是指針,那么存儲對象將使您的生活更輕松。 如果它確實必須是一個指針(例如因為GraphObject是一個多態基類),我建議存儲智能指針: std::unique_ptr ,或std::tr1::shared_ptrboost::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM