Как эффективно вставить элементы в карту?

0

Как эффективно вставлять элементы в std :: map? Общим требованием является то, что если на карте уже есть ключ элемента, верните false; иначе вставьте его и верните true. Я не могу найти хороший готовый метод для этого.

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

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;
}
  • 0
    @POW для этого вам нужна конструкция типа map-value; то есть std::pair<Key,Value> (и я вижу, что Даниэль уже обновил ответ, чтобы использовать value_type карты value_type , как я бы это тоже сделал, но опять же, я использую C ++ 11, поэтому .. Я не буду =)).
1

Следуя ответам Дэниелса, могу ли я предложить использовать insert() вместо emplace() и предоставить отдельный метод emplace() для вашего класса, если вам это нужно?

Причина в том, что emplace() делает явные конструкторы неявными. Это означает, что если значение не копируется, вам нужно либо использовать map.insert, либо убедиться, что Value предоставляет оператор присваивания перемещения. Вставка() также поддерживает обратную совместимость с компиляторами pre С++ 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;
}
  • 0
    Если значение не подлежит копированию, как будет работать ваш emplace ? Обратите внимание, что emplace для map довольно странный, так как value_type значение value_type !

Ещё вопросы

Сообщество Overcoder
Наверх
Меню