如何有效地在std :: map中插入元素?一个常见的要求是,如果地图已经有元素键,则返回false;否则插入并返回true。我找不到一个好的方法来做到这一点。
template<class Key, class Value>
bool insert(Key const& key, Value const& value, std::map<Key, Value>& myMap);
答案 0 :(得分:4)
如何使用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;
}
答案 1 :(得分:1)
根据Daniels的回答,如果您需要,我可以建议使用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;
}