我有一个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[]
。像 emplace
和 insert
这样的东西不会覆盖你的值,如果它已经存在,所以只需:
map[key] = newVal;
无论key
以前是否存在于地图中都可以工作。