2012-09-13 78 views
1
map<pair<double,double>,double> vectorDoubleMap; 

vectorDoubleMap[ pair<double, double>(10, 10) ] = 1;   //1. 
vectorDoubleMap.insert(pair<double, double>(10, 10), 1);  //2. 

'1.'語句編譯完成,但'2'。聲明未編譯。stl map插入運算符[]對區別

這兩個聲明有什麼區別?

+1

請格式化代碼並首先修復印刷錯誤。 – UnknownGosu

回答

1

map::insert取單個對參數保存鍵和值,而不是鍵和值作爲單獨的參數。如果你傳遞第二個參數,第一個參數是一個迭代器,用作提供插入位置的提示,而第二個參數仍然是一對。

所以你必須寫其中之一:

vectorDoubleMap.insert(pair<pair<double, double>, double>(pairs<double, double>(10, 10), 1)); 
vectorDoubleMap.insert(make_pair(make_pair(10, 10), 1)); 

你可以看到make_pair使簡潔得多在這種情況下的語法。 (因爲數字是以整數文字形式輸入的,所以首先會構造整數對,但是對於一種到另一種類型的對有一個conversion constructor,所以這是正確的,並且將根據需要轉換爲double。編譯器甚至可以優化整數除去,並直接在其生成的代碼中使用雙精度)。

如果該鍵不存在於映射中,那麼這兩個語句在性能上將是相同的並且效果相似。如果密鑰已存在,[…]=…表單將覆蓋它,而insert(…)表單將保留舊值。

請注意,C++ 17可能會提供兩種方法來完成同樣的事情。 insert_or_assign大致相當於您的第一行,因爲它會覆蓋現有的值。 try_emplace更像第二個,因爲如果密鑰已經存在,它不會覆蓋。這兩個關鍵的好處是,他們接受構造函數的參數,並構建對象。這對於double沒有多大用處,但對於難以構建,複製或移動的其他對象可能是有用的。但仍然,try_emplace採取單獨的論點,而不是一個pair這一事實使得這一個很好的替代上面討論的insert

vectorDoubleMap.insert_or_assign(make_pair(10, 10), 1); 
vectorDoubleMap.try_emplace(make_pair(10, 10), 1); 
0

看看insert功能,您應該插入使用一對:

vectorDoubleMap.insert(pair<pair<double,double>,double>(pair<double, double>(10, 10), 1));

或利用make_pair功能,使代碼簡潔:

vectorDoubleMap.insert(std::make_pair(pair<double, double>(10, 10), 1));

當您運行進入編譯器錯誤,首先要做的是讀取錯誤信息並檢查api引用。

+0

我想我們需要一種方法來檢測那些盲目投票的人 –