Как обработать вставку уже существующего ключа?

#c #dictionary

#c #словарь

Вопрос:

Каков стандартный способ обработки попытки вставить ключ в карту, которая уже содержит этот ключ?

  1. Должна ли выдаваться ошибка?

  2. Должна ли функция вставки просто возвращаться без добавления пары ключ / значение?

  3. Должна ли функция вставки удалять уже существующую пару ключ / значение и вставлять новую пару ключ / значение?

Спасибо 🙂

Ответ №1:

std::map::insert возвращает пару (итератор, логическое значение). Если ключ отсутствовал, он вставляется с заданным значением, и функция возвращает итератор для него и true во втором компоненте.

Если ключ уже присутствовал, старое значение сохраняется. Функция возвращает итератор к существующему элементу и false во втором компоненте.


Начиная с C 17, std::map также предоставляет insert_or_assign функцию-член. Он ведет себя так же, за исключением того, что старое значение заменяется новым значением, когда ключ уже присутствует.

Комментарии:

1. Привет, Игорь. Большое спасибо. Это действительно помогает 🙂

2. insert_or_assign … из моих дней хранимых процедур SQL мы бы назвали это upsert , но это, вероятно, слишком причудливо для комитета в наши дни.

3. Insert_or_assign довольно неуклюж в сравнении