insert
и operator[]
оба очень полезные методы.Они выглядят одинаково, однако детали делают их очень разными.
operator []
Возвращает ссылку на элемент, который вы ищете.Когда элемент не существует, он создает новый элемент по умолчанию.(Требуется конструктор по умолчанию)
При использовании для вставки элемента: myMap[key] = value;
значение переопределяет старое значение ключа.
insert
Возвращает итератори бул.Итератор для элемента.Значение bool указывает, был ли вставлен новый элемент (true) или он уже содержал элемент для ключа (false).
Для использования insert не требуется конструктор по умолчанию.
При использованиичтобы вставить новый элемент: myMap.insert({key, value});
, старое значение не обновляется, если ключ уже существует на карте.
insert_or_assign
Tnx Марку Глиссу, который упомянул об этом в комментариях.
Этот метод похож на insert
.Различие заключается в поведении, когда элемент уже существует, и в этом случае он переопределит существующий элемент.
Возвращает итератор и логическое значение.Итератор для элемента.Значение bool указывает, был ли добавлен новый элемент (true), или он уже содержал элемент для ключа (false).
Использование insert_or_assign не требует конструктора по умолчанию.
При использованиичтобы вставить новый элемент: myMap.insert({key, value});
, старое значение обновляется, если ключ уже существует на карте.
Построение карты
Ваш вариант использования вставляет данные в карту и предполагает, что ключ не существует.Написание baseData[index] = _value;
точно сделает то, что вы хотите.
Однако, если бы мне пришлось написать это, я бы выбрал вариант вставки:
auto successfulInsert = baseData.emplace(SC_val, _value).second;
assert(successfulInsert && "Value has been inserted several times.");