在提升::unordered_map中有效地插入或更新

Efficiently inserting or updating in boost::unordered_map

本文关键字:插入 有效地 更新 unordered map      更新时间:2023-10-16

我有一个boost::unordered_map<std::string, std::string>,每当我向映射中添加一个键/值对时,如果映射中已经存在以前的键,我希望删除旧值并替换为新值。 另外,由于我的编译器和库支持 emplace() ,我想使用它(假设它可以消除临时的构造)。

编程最有效的方法是什么? 我发现 Boost 文档在这里有点难以理解。

我的编译器是 g++ 4.4.7 带有-std=g++0x

使用可选的插入点提示(通过首先调用find()获得):

iterator       insert(const_iterator hint, const value_type& obj);

emplace 的情况下,它不是同名重载:

template <class... Args> iterator emplace_hint(const_iterator position, Args&&... args);

我从 C++14 草案标准中获得了这些签名,因为这是我手边的东西,但如果它有emplace,它们应该可以追溯到 Boost,否则无论如何你都应该更新你的编译器。在旧编译器上使用像 Boost 这样不稳定的平台是没有意义的 -std=c++0x


警告

如果不替换预先存在的条目,find 将不会返回有用的提示。

如果要替换条目,不妨将新值分配给现有对象。

因此,该提示仅在您实际想要erase旧对象并insert新对象的情况下才有用。

我想你只是想在这里使用operator[]。像 emplaceinsert 这样的东西不会覆盖你的值,如果它已经存在,所以只需:

map[key] = newVal;

无论key以前是否存在于地图中都可以工作。