2010-02-22 66 views
12

我有以下地圖結構:map < pair < int,int >, object* >,我希望將其插入到地圖中。如何將地圖插入地圖

我會怎麼做,因爲我想插入一對和對象我必須做一對出來的呢?

我應該使用make_pair()創建一對新對嗎?如果是這樣,你可以讓我知道如何做到這一點?

+5

你試過了什麼代碼? – Mark 2010-02-22 15:26:55

回答

20
object * myObject = // get an object somehow 
myMap.insert(std::make_pair(std::make_pair(1,2), myObject)); 

typedef map<pair<int, int>, object *> MapType; 
object * myObject = // get an object somehow 
myMap.insert(MapType::value_type(std::make_pair(1,2), myObject)); 
+0

我用你的第一個建議 - 很好,簡潔。非常感謝! – Myx 2010-02-22 15:49:33

+2

如果您在代碼中使用了很多代碼,您可能需要使用插入(pair,object)函數將該地圖包裝到類中以提高可讀性。 – 2010-02-22 16:00:14

1

有兩種方式:

typedef std::map<int,Object> map_t; 
map_t map; 
Object obj; 

std::pair<map_t::iterator, bool> result = map.insert(std::make_pair(1,obj)); // 1 

map[1] = obj; // 2 
  1. 只有工作,如果關鍵是不存在的,迭代器指向對與鍵值並且bool表示它是否已被插入。

  2. 容易,但如果它不存在的物體首先被默認構造,然後分配而不是拷貝構造

如果您不必擔心性能,只是是否選擇或者不想刪除以前的條目。

+0

正確,但問題是關於一個關鍵類型也是一對的地圖。 – 2010-02-22 15:30:02

+0

我無法看到依賴關係。 'sed s/1/std :: make_pair(1,1)/ g'和適當定義的'map_t'。它不會改變評論或任何內容,我只是喜歡用簡單的概念來演示,以幫助關注重點而不是隱藏在人羣中。 – 2010-02-23 16:05:18

10

假設你正在使用C++ 11或更高,最好的辦法可能是:

object * myObject = // get an object somehow 
myMap.emplace({1,2}, myObject); 

對於地圖,emplace可以作爲一個版本的insert,是以鍵和值作爲單獨的被認爲是參數(它實際上可以採用對應的類型的構造函數可以採用的參數的任意組合)。除了語法上更清潔以外,它還可能比make_pair更有效,因爲make_pair通常會生成一個輸出,其類型與容器的value_type不完全匹配,因此會導致不必要的類型轉換。

我曾經建議這一點,這也只適用於C++ 11或更高版本:

object * myObject = // get an object somehow 
myMap.insert({{1,2}, myObject}); 

這就避免了略微令人驚訝的使用emplace,但以前沒有如果鍵或值工作類型是僅移動的(例如unique_ptr)。這已經在標準中得到了修復,但您的標準庫實現可能還沒有找到修復。這在理論上可能效率稍低一些,但是通過這種方式,任何中等程度的編譯器都可以輕鬆優化。

+0

我認爲官方答案和這一個應根據編譯器版本標準進行合併 – Aviv 2017-12-03 06:37:33