0

如何有效地在 std::map 中插入元素?一个常见的要求是,如果 map 已经有元素键,则返回 false;否则插入它并返回true。我找不到一个好的现成方法来做到这一点。

template<class Key, class Value>
bool insert(Key const& key, Value const& value, std::map<Key, Value>& myMap);
4

2 回答 2

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;
}
于 2013-10-12T20:37:02.500 回答
1

继丹尼尔斯的回答之后,我是否可以建议使用 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;
}
于 2013-10-12T20:52:58.843 回答