簡體   English   中英

有效地使用 std::unordered_map 插入或增加鍵的值

[英]effectively use std::unordered_map to insert or increment value of a key

給定一個無序 map M,一個鍵 K,一個初始值 V。如果 K 不在 M 中,我想將 M[K] 設置為 V; ++M[K] 如果 K 在 M 中。(例如,使用 map 來計算元素的出現次數)

有幾種方法可以實現,但是當我們將 find 和 insert/increment 分成兩個步驟時,至少我們需要 hash(K) 兩次(如何使提示有幫助?我認為提示只有在 K 在 M 中時才有用); 另一方面,當我們使用成員 function insert_or_assign 時,我們不能根據 K 是否在 M 中設置不同的 M[K]。

有沒有更好的辦法?

insert()成員 function 返回一個包含迭代器和布爾值的對; 迭代器指向插入的對或已經存在的對,布爾值告訴你它是哪一個(如果為真,則插入一個新的 map 元素;如果為假,則返回的迭代器指向已經存在的東西,值為沒有改變)。

使用它,您可以在所有情況下使用單個 hash 操作將元素放在那里(如果不存在)或找到它:

auto result = M.insert({ K, V });
if (!result.second) {
    // Element was already present; increment the value at the key K.
    ++(result.first->second);
}

我想我找到了一種方法:當 K 已經在 M 中時,try_emplace 會將迭代器返回給 M[K]。然后我們只需更新 M[K]。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM