2014-06-20 63 views
1

我有一個無序的地圖std::unordered_map<unsigned int, MyObject*> myDictionaryC++在unordered_map中添加新對象的最佳方法

當我想添加一個條目時,我首先要檢查該鍵是否已經存在。如果是這樣,我需要訪問我的對象來調用一個函數。

如果該鍵不存在,我想用這個鍵創建一個新的MyObject。

做這個更好嗎?

MyObject *my_obj; 
try 
{ 
    my_obj = myDictionary.at(key); 
} 
catch (int e) 
{ 
    my_obj = new MyObject(); 
    myDictionary[key] = my_obj; 
} 
my_obj->Function(); 

或者這個?

MyObject *my_obj; 
if(myDictionary.find(key) == myDictionary->end()) 
{ 
    my_obj = new MyObject(); 
    myDictionary[key] = my_obj; 
} 
else 
{ 
    my_obj = myDictionary[key]; 
} 
my_obj->Function(); 

還是別的什麼?

+5

請不要讓原始指針自己的資源。假設你不能在你的地圖中使用普通的'MyObject',使用智能指針。 – chris

+0

如果你不知道什麼是智能指針...請參閱http://stackoverflow.com/questions/106508/what-is-a-smart-pointer-and-when-should-i-use-one – bwegs

+0

在處理異常時應使用try和catch - 通常在代碼有問題時 - 而不是用於控制程序流。我也同意克里斯,你應該在那裏使用智能指針。 – finlaybob

回答

2

的最佳方式將是在地圖包含MyObject,而不是MyObject *

std::unordered_map<unsigned int, MyObject> myDictionary; 

並以此

myDictionary[key].Function(); // if key doesn't exist, it'll be inserted for you 

假設你必須使用MyObject *,使用unique_ptr拿着他們而不是使用原始指針。

std::unordered_map<unsigned int, std::unique_ptr<MyObject>> myDictionary; 

unsigned key = 42; 
if(myDictionary.find(key) == myDictionary.end()) { 
    myDictionary.insert(std::make_pair(key, std::unique_ptr<MyObject>(new MyObject()))); 
} 
myDictionary[key]->Function(); 
2

在你的情況,我想這個去:

MyObject*& my_obj= myDictionary[key]; 

if (my_obj==nullptr) 
    my_obj= new MyObject; 

my_obj->Function(); 

這樣,您保存雙查找(一個用於查找和一個用於插入)到地圖的其他方法插入時做。

正如有人說,這雖然不是專門針對你的問題,請使用智能指針:

// Using a std::unordered_map<unsigned int, std::unique_ptr<MyObject>> 
std::unique_ptr<MyObject>& my_obj= myDictionary[key]; 

if (my_obj==nullptr) 
    my_obj.reset(new MyObject); 

my_obj->Function(); 
+0

感謝理智的聲音,使用'find',然後'insert'如果沒有找到*就是*首先是'[]'是什麼。唯一不能使用的情況是該值不能被默認構建,在這種情況下'emplace'可能是一個相當不錯的交易。 –

相關問題