如何有效地在 std::map 中插入元素?一个常见的要求是,如果 map 已经有元素键,则返回 false;否则插入它并返回true。我找不到一个好的现成方法来做到这一点。
template<class Key, class Value>
bool insert(Key const& key, Value const& value, std::map<Key, Value>& myMap);
如何使用std::map::emplace
:
template<class Key, class Value>
bool insert(Key const& key, Value const& value, std::map<Key, Value>& myMap)
{
return myMap.emplace(key,value).second;
}
如果它在您的环境中不可用,您可以使用
template<class Key, class Value>
bool insert(Key const& key, Value const& value, std::map<Key, Value>& myMap)
{
typedef typename std::map<Key, Value>::value_type value_type;
return myMap.insert(value_type(key,value)).second;
}
继丹尼尔斯的回答之后,我是否可以建议使用 insert() 而不是 emplace() 并在需要时在您的类上提供单独的 emplace() 方法?
原因是 emplace() 使显式构造函数隐式化。这意味着如果 Value 是不可复制的,您将需要使用 map.insert 或确保 Value 提供移动赋值运算符。insert() 还保持与 C++11 之前的编译器的向后兼容性(如果这可能是一个问题)。
template<class Key, class Value>
bool insert(Key const& key, Value const& value, std::map<Key, Value>& myMap)
{
return myMap.insert(std::make_pair(key,value)).second;
}
template<class Key, class Value>
bool emplace(Key const& key, Value const& value, std::map<Key, Value>& myMap)
{
return myMap.emplace(key,value).second;
}