2012-04-26 38 views
0

下面是一些工作代碼:地圖最大效率的插入

std::pair<typename std::map< time_t, T >::iterator, bool> ret;  
ret = prt_map->insert (std::pair< time_t, T >(seconds , value)); 
if (ret.second == false) // exists 
{ 
... update exising value 
} 

我想將它升級到最大效率的插入代碼,並給小費,以插入需要從--prt_map-開始>結束();是這樣的:

prt_map->insert (--prt_map->end(), std::pair< time_t, T >(seconds , value)); 

但這插入功能prototupe不BOOL該通知增值與否(檢查現有和更新,如果這樣返回的std ::對...如何解決這個有能力更新現有值

+0

爲了獲得最大的效率,你可能想使用一個哈希表中定義(比如'的std :: unordered_map' )。 – 2012-04-26 21:12:17

+0

@ n-m我不能總是使用新的gcc,因此當我編譯程序時,系統可能不支持unordered_map。 – abrahab 2012-04-26 21:51:03

+0

'boost :: unordered_map'幾乎在任何地方都被支持。 – 2012-04-26 21:54:56

回答

5

a.insert(提示,t)的交條件是:。

一個包含一個元素,其關鍵是相同噸的的大小被增加1或0.

它應該有足夠的信息來確定元素是否被插入。

+0

不錯。但現在的問題是什麼是更有效的,我的第一個功能,或將要求和存儲以前的大小值,然後請求新的大小值+比較的功能。 – abrahab 2012-04-26 21:45:47

0

如果密鑰已經存在,第二個版本(就像第一個版本)不更新值。您可以檢查是否確實更新/插入:

std::map<time_t, T>::iterator ret = prt_map->insert(--prt_map->end(), 
    std::make_pair(seconds, value)); 
if (*ret != value) { 
    // the same key already exists, update value 
    *ret = value; 
} 

這裏假設你有operator!=()對價值型

+0

你檢查相同的值,但它可以是其他值。需要檢查密鑰。只有在密鑰相同的情況下才更新。 – abrahab 2012-04-26 21:43:03

+0

返回的迭代器中的鍵_will_be_是您希望將值與該值關聯的鍵,但是隻有在新插入的值或者與鍵關聯的已存在值恰好與鍵值相同的情況下,值纔會相同你想插入 – Attila 2012-04-26 23:01:03