當關乎效率時應該在map::operator和map-insert之間仔細選擇
class widget {
public:
widget();
widget(double weight);
widget& operator=(double weight);
mapm;
m[1] = 1.50;
表示式m[1]是m.operator(1)的簡化,所以這是乙個map::operator的呼叫。那個函式必須返回乙個widget的
引用,因為m 的對映型別是widget。在這裡,m裡面還沒有任何東西,所以鍵1在map裡沒有入口。因此
operator預設構造乙個widget來作為關聯到1的值,然後返回到那個widget的引用。最後,widget成為賦值目
標:被賦值的值是1.50。
換句話說,這個語句
m[1] = 1.50;
功能上等價於這個:
typedef mapintwidgetmap; // 方便的
// typedef
pairresult = // 用鍵1建立新
m.insert(intwidgetmap::value_type(1, widget())); // 對映入口
// 和乙個預設構造的
// 值物件;
// 看下面對於
// value_type的
// 注釋
result.first->second = 1.50; // 賦值給
// 新構造的
條款24:當關乎效率時應該在map::operator和map-insert之間仔細選擇
// 值型別
現在已經很清楚為什麼這種方法可能降低效能了。我們先預設構造乙個widget,然後我們立即賦給它新值。
如果用想要的值構造widget比預設構造widget然後進行賦值顯然更高效,我們就應該用直截了當的insert呼叫
來替換operator的使用(包括它的構造加賦值):
m.insert(intwidgetmap::value_type(1, 1.50));
這與上面的那些**有相同的最終效果,除了它通常節省了三次函式呼叫:乙個建立臨時的預設構造widget
物件,乙個銷毀那個臨時的物件和乙個對widget的賦值操作。那些函式呼叫越昂貴,你通過使用map-insert代
替map::operator就能節省越多。
上面的**利用了每個標準容器都提供的value_type typedef。這typedef沒有什麼特別重要的,但對於map和
multimap(以及非標準容器的hash_map和hash_multimap——參見條款25),記住它是很重要的,容器元素的
型別總是某種pair。
我早先談及的operator被設計為簡化「新增或更新」功能,而且現在我們理解了當「增加」被執行時,insert
比operator更高效。當我們做更新時,情形正好相反,也就是,當乙個等價的鍵(參見條款19)這已經在
map裡時。為了看出為什麼情況是這樣,看看我們的更新選項:
m[k] = v; // 使用operator
// 來把k的值
// 更新為v
m.insert(
intwidgetmap::value_type(k, v)).first->second = v; // 使用insert
// 來把k的值
// 更新為v
語法本身也許會讓你信服地支援operator,但在這裡我們關注於效率,所以我們將忽略它。insert的呼叫需要
intwidgetmap::value_type型別的實參(即pair),所以當我們呼叫insert時,我們必須構造和析構
乙個那種型別的物件。那耗費了一對建構函式和析構函式,也會造成乙個widget的構造和析構,因為
pair本身包含了乙個widget物件,operator沒有使用pair物件,所以沒有構造和析構pair和
widget。
因此出於對效率的考慮,當給map新增乙個元素時,我們斷定insert比operator好;而從效率和美學考慮,當
更新已經在map裡的元素值時operator更好。如果stl提供乙個兩全其美的函式,即,在句法上吸引人的包
中的高效的「新增或更新」功能。
Map遍歷效率比較
1 由來 上次部落格提到了map的四種遍歷方法,其中有的只是獲取了key值或者是value值,但我們應該在什麼時刻選擇什麼樣的遍歷方式呢,必須通過實踐的比較才能看到效率。也看了很多文章,大家建議使用entryset,認為entryset對於大資料量的查詢來說,速度更快,今天我們就通過下面採用不同方法...
Map遍歷效率比較
原博 1 由來 上次部落格提到了map的四種遍歷方法,其中有的只是獲取了key值或者是value值,但我們應該在什麼時刻選擇什麼樣的遍歷方式呢,必須通過實踐的比較才能看到效率。也看了很多文章,大家建議使用entryset,認為entryset對於大資料量的查詢來說,速度更快,今天我們就通過下面採用不...
map與unordered map效率的比較
之前在某blog看到map在非常少量資料下插入效率高於unordered map。自己測了一下並非如此,在設定合適的桶數的情況下,有如下結論 1 插入效率unordered map任何情況下均優於map,資料越多越明顯。2 遍歷效率map略優於unordered map。補充 1 只在 g 4.4....