map 效率問題

2021-05-25 02:03:03 字數 2110 閱讀 7570

當關乎效率時應該在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....