我有一个boost::unordered_map<std::string, std::string>
,每当我将一个键/值对添加到地图中已存在先前Key的地图时,我希望删除旧值并替换为新值。此外,由于我的编译器和库支持emplace()
,我想使用它(假设它可能会消除临时构造)。
最有效的编程方法是什么?我发现Boost doc在这里有点难以理解。
我的编译器是带有-std=g++0x
答案 0 :(得分:1)
使用可选的插入点提示(首先通过调用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,否则你应该更新你的编译器。在旧的编译器上使用-std=c++0x
这样的摇摇欲坠的平台没有任何意义。
如果不替换预先存在的条目,find
将不会返回有用的提示。
如果 替换条目,您也可以将新值分配给现有对象。
因此,提示仅在您实际想要erase
旧对象和insert
新对象的情况下才有用。
答案 1 :(得分:1)
我想你只想在这里使用operator[]
。像emplace
和insert
这样的内容如果已经存在则不会覆盖您的值,所以只需:
map[key] = newVal;
无论之前是否存在key
,都可以使用。