在boost :: unordered_map中高效插入或更新

时间:2013-12-20 02:05:58

标签: c++ boost c++11 unordered-map

我有一个boost::unordered_map<std::string, std::string>,每当我将一个键/值对添加到地图中已存在先前Key的地图时,我希望删除旧值并替换为新值。此外,由于我的编译器和库支持emplace(),我想使用它(假设它可能会消除临时构造)。

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

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

的g ++ 4.4.7

2 个答案:

答案 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[]。像emplaceinsert这样的内容如果已经存在则不会覆盖您的值,所以只需:

map[key] = newVal;

无论之前是否存在key,都可以使用。