std :: unordered_map :: insert vs std :: unordered_map :: operator [] - PullRequest
0 голосов
/ 01 октября 2018

У меня есть контейнер типа unordered_map, и я хотел получить подтверждение, какую версию мне следует использовать, если я хочу добавить элемент на карту.Я хочу, чтобы оно перезаписало старое значение новым, если оно существует, и просто добавило его, если его нет.

Я вижу, что insert добавляет элемент, если оно завершается, а также возвращает пару итераторов и bool, гдеbool указывает, если вставка прошла успешно.Я также вижу, что operator [] добавляет элемент, если он не существует, и перезаписывает его, если он существует.

Мой вопрос в основном заключается в том, стоит ли мне использовать operator [] для этой цели или есть какие-то ошибки, которые я не рассмотрел.Также, если мое восприятие этих методов неверно, пожалуйста, исправьте меня.

вот что я собирался сделать.Данные представляют собой перечисление с областью видимости типа int

void insertData(const Data _Data, const int _value)
{
 int SC_val = static_cast<int>(_Data);
 //sc val is now the integer value of the Data being added

 //returns a pair of iterator and bool indicating whether the insert was successful
auto ret = baseData.insert(std::pair<int,int>(SC_val,_value));

 if (ret.second == false)
 {//if the insert was not successful(key already exists)
     baseData[ret.first->first] = _value;
 }
}

или я должен просто сделать

int index = static_cast<int>(_Data);

baseData[index] = _value;

Я склоняюсь к версии оператора [], поскольку не вижу реальной разницы, и этогораздо меньше кода.Пожалуйста, посоветуйте и спасибо всем заранее.

Ответы [ 3 ]

0 голосов
/ 01 октября 2018

Кажется, что вы хотите вставить данные только тогда, когда они не существуют в baseData.Вы можете использовать count (), чтобы проверить, есть ли данные на карте следующим образом:

int index = static_cast<int>(_Data);
if(!baseData.count(index))
{
  baseData[index] = _value
}
0 голосов
/ 01 октября 2018

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.");
0 голосов
/ 01 октября 2018

Просто использование оператора [] идеально подходит для вашего случая.

К вашему сведению: цитата из cppreference.com std :: unordered_map :

std::unordered_map::operator[]
Returns a reference to the value that is mapped to a key equivalent to key, performing an insertion if such key does not already exist.

Я не вижу реальной разницы, и это намного меньше кода.

Ты прав!

...