C ++ эквивалентен Java Карта getOrDefault? - PullRequest
1 голос
/ 07 февраля 2020

Java getOrDefault был хорошей конструкцией для доступа одной строки к значению карты или к начальной точке, если она не существует. Я не вижу ничего в ссылке на карту в C ++ с параллелью. Существует ли что-то или вы создаете свое собственное?

У меня есть объекты на карте, которые я бы обновил, если они существуют, но создал бы новые, если их нет. С getOrDefault я мог бы создать объект на стороне по умолчанию или получить к нему доступ, если он существует.

http://www.cplusplus.com/reference/map/map/

https://www.geeksforgeeks.org/hashmap-getordefaultkey-defaultvalue-method-in-java-with-examples/

Ответы [ 3 ]

1 голос
/ 07 февраля 2020

У меня есть объекты на карте, которые я бы обновил, если они существуют, но создал бы новые, если их нет. С помощью getOrDefault я мог бы создать объект на стороне по умолчанию или получить к нему доступ, если он существует.

Использовать emplace.

auto& element = *map.emplace(key, value).first;

emplace вставить новый элемент если ключ отсутствует, и возвращает пару, состоящую из итератора для элемента (вставлен или уже существует) и значение bool, указывающее, имела ли место место вставка.

0 голосов
/ 19 апреля 2020

Я попал сюда, когда пытался найти способ решить вопрос с одним номером LeetCode с помощью HashTable в C ++.

Нет прямой альтернативы getOrDefault, который используется в подходах 2 и Java, но я смог использовать operator [] для доступа к элементу unordered_map. См. http://www.cplusplus.com/reference/unordered_map/unordered_map/operator [] /

Если ключ существует на карте, то оператор [] вернет ссылку на свое отображенное значение.

Если ключ не существует, то оператор [] добавит ключ на карту со значением 0.

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

Например, я использовал следующее в C ++

for (int i : nums) { hash_table[i] = hash_table[i] + 1; }

, которое является альтернативой следующему в Java

for (int i : nums) { hash_table.put(i, hash_table.getOrDefault(i, 0) + 1); }

0 голосов
/ 07 февраля 2020

Может быть, я неправильно понимаю, что вы спрашиваете, но вот как map работает.

map<int, string> m;
string s = m[3];

установит s в значение по умолчанию string.

Когда вы используете operator[] для поиска ключа на карте, он всегда вернет вам значение. Если ключ не существует на карте, он вставит его с созданным по умолчанию значением.

Если вам нужно такое поведение, но с другим значением (не созданным по умолчанию значением), тогда вы может использовать emplace, как предложил Л.Ф.

...