эффективно использовать std :: unordered_map для вставки или увеличения значения ключа - PullRequest
0 голосов
/ 13 июля 2020

Учитывая карту разупорядочения M, ключ K, начальное значение V. Я хочу установить M [K] в V, если K не входит в M; ++ M [K], если K находится в M. (например, используйте карту для подсчета вхождений элементов)

Есть несколько способов добиться этого, но когда мы разделяем поиск и вставку / приращение на два шага, по крайней мере, нам нужно дважды ha sh (K) (Как заставить подсказки помочь? Я думаю, что подсказка помогает, только когда K находится в M); С другой стороны, когда мы используем функцию-член insert_or_assign, мы не можем установить M [K] в зависимости от того, находится ли K в M.

Есть ли лучший способ?

Ответы [ 2 ]

4 голосов
/ 13 июля 2020

Функция-член insert() возвращает пару, содержащую итератор и логическое значение; итератор указывает либо на вставленную пару, либо на пару, которая уже существует, а логическое значение сообщает вам, что это за (если true, новый элемент карты был вставлен; если false, возвращенный итератор указывает на что-то уже присутствующее, и значение было не изменено).

Используя это, вы можете поместить элемент туда, если его не было, или найти его, если он был там, используя одну операцию ha sh во всех случаях:

auto result = M.insert({ K, V });
if (!result.second) {
    // Element was already present; increment the value at the key K.
    ++(result.first->second);
}
0 голосов
/ 13 июля 2020

Думаю, я нашел способ сделать это: try_emplace вернет итератор в M [K], когда K уже находится в M. Затем мы просто обновляем M [K].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...