Чтобы вставить, существует ли ключ:
typedef std:::map<K, V> map_type;
std::pair<typename map_type::iterator, bool> p
= my_map.insert(std::pair<K const &, V const &>(key, new_value));
if (!p.second) p.first->second = new_value;
Эта конструкция использует тот факт, что insert
уже выполняет find()
, и если вставка завершается неудачно, вы можете немедленно использовать полученный итератор для перезаписи сопоставленного значения.
Здесь есть определенная скрытая стоимость: вставка всегда делает копию элемента, независимо от того, успешно ли он выполняется. Чтобы избежать даже этого, мы можем использовать несколько более подробный подход, используя lower_bound()
для поиска предполагаемого ключа и одновременно обеспечить правильную позицию вставки для нового элемента:
typename map_type::iterator it = my_map.lower_bound(key);
if (it == my_map.end() || it->first != key)
{
my_map.insert(it, std::pair<K const &, V const &>(key, new_value)); // O(1) !
}
else
{
it->second = new_value;
}
Версия с двумя аргументами insert()
работает в постоянном времени, если подсказка вставки (итератор в первом аргументе) является правильной позицией для вставки, что в точности и обеспечивает lower_bound()
.