2012-06-18 38 views
3

所以在概念上,我試圖創建一個指向我的對象的指針數組散列。向量的C++ unordered_map

散列鍵是對象類型的整數,而數組是要呈現的對象的列表。

我試圖做的是:

unordered_map<int, vector<Object*> > drawQueue; 
drawQueue.clear(); // new empty draw queue 

for (...) { 
    drawQueue.at(type).push_back(my_obj); 
} 

所以我不會的東西STL的細微差別相當熟悉,因爲我得到一個異常說out_of_bounds,這是當密鑰將會怎麼樣不存在。

所以我想我需要先創建密鑰,然後添加到載體:

if (drawQueue.count(type)) { 
    // key already exists 
    drawQueue.at(type).push_back(my_obj); 
} else { 
    //key doesn't exist 
    drawQueue.insert(type, vector<Object*>); // problem here 
    drawQueue.at(type).push_back(my_obj); 
} 

但現在我真的失去了,因爲我不知道如何創建/初始化/什麼一個空的vector插入的unordered_map ...

或者我這樣做是完全錯誤的方式?

任何提示明智的人?

+0

你看看operator []的?或insert()的實際文檔? – PlasmaHH

+1

**接受**答案,這很有用。 – gsamaras

回答

3

您沒有正確使用insert。這應該工作:

drawQueue.insert(std::make_pair(type, std::vector<Object*>())); 

如果使用C++ 11,前面的語句可以簡化爲:

drawQueue.emplace(type, std::vector<Object*>()); 

通過使用這種方法的元素被就地構建的(即沒有複製或移動操作被執行)。

我還包括指向insertemplace文檔的鏈接。

+0

在C++ 11中,你可以說'drawQueue.emplace(type);'。 –

+0

@KerrekSB對於我來說GCC 4.6(使用'-std = C++ 0x')不起作用。你正在使用哪種編譯器? – betabandido

+0

@KerrekSB我嘗試了GCC 4.7,它的工作:)我會更新我的答案,包括這種可能性。 – betabandido

1

我認爲這是一個簡單的方法。我的例子將創建一個unordered_map字符串作爲鍵值和整數向量。

unordered_map<string,vector<int>> keys; 
keys["a"] = vector<int>(); // Initialize key with null vector 
keys["a"].push_back(1); // push values into vector. 
keys["a"].push_back(5);  
for(int i : keys["a"]){ 
    cout << i << "\t"; 
}