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

yus*_*hao 1 c++ stl

给定一个无序映射 M、一个键 K、一个初始值 V。如果 K 不在 M 中,我想将 M[K] 设置为 V;++M[K] 如果 K 在 M 中。(例如使用映射来计算元素的出现次数)

有多种方法可以实现这一点,但是当我们将查找和插入/增量分成两个步骤时,至少我们需要两次 hash(K) (如何使提示有帮助?我认为只有当 K 在 M 中时提示才有帮助);另一方面,当我们使用成员函数insert_or_assign时,我们不能根据K是否在M中来设置不同的M[K]。

有没有更好的办法?

cdh*_*wie 5

成员insert()函数返回一个包含迭代器和布尔值的对;迭代器指向插入的对或已经存在的对,并且 bool 告诉您它是哪一个(如果为 true,则插入了一个新的映射元素;如果为 false,则返回的迭代器指向已经存在的内容,并且值是没有改变)。

使用此功能,您可以在所有情况下使用单个哈希操作将元素放在那里(如果不存在)或找到它(如果存在):

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