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插入運算符[]對區別
這兩個聲明有什麼區別?
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插入運算符[]對區別
這兩個聲明有什麼區別?
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);
看看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引用。
我想我們需要一種方法來檢測那些盲目投票的人 –
請格式化代碼並首先修復印刷錯誤。 – UnknownGosu