Как получить подмножество карты из другой карты на основе списка ключей? С++

У меня есть образец старой карты:

map<string, int> map_ = {"A": 1, "B": 2, "C": 3, "D": 4, "E": 5}

и список ключей:

vector<string> list_ = {"B", "D", "E"}

Я хочу получить новую карту из старой на основе списка ключей:

map<string, int> mapNew_ = {"B": 2, "D": 4, "E": 5}

Есть ли какой-нибудь умный способ сделать это?

Что вы считаете "глупым" способом сделать это?

PaulMcKenzie 22.04.2022 21:50

@PaulMcKenzie Выньте каждый элемент и создайте список значений, затем создайте новую карту из списка значений и списка ключей.

Cyan 22.04.2022 21:51

Хм... Что такое "список значений"? Эти термины не являются обычной терминологией C++. Простой способ - это ответ, данный @NathanOliver. Похоже, вы, возможно, слишком много думали о том, как это сделать, основываясь на каком-то другом языке программирования.

PaulMcKenzie 22.04.2022 21:51
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
1
3
34
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете сделать это с помощью простого цикла for на основе диапазона. Это будет выглядеть как

map<string, int> mapNew_;
for (const auto& e : list_)
    mapNew_[e] = map_[e];

Если бы list_ мог содержать элементы, которых нет на карте, вам нужно было бы добавить проверку для этого, например

map<string, int> mapNew_;
for (const auto& e : list_)
    if (auto it = map.find(e); it != map.end())
        mapNew_[e] = it->second; // no map_[e] here since it already points to the needed value

Конечно, единственная проблема заключается в том, что list_ содержит значения, которых нет в map_.

PaulMcKenzie 22.04.2022 21:54

Ах это аккуратно! Большое спасибо!

Cyan 22.04.2022 21:55

@PaulMcKenzie Хороший звонок. Добавлена ​​версия для обработки, если это так.

NathanOliver 22.04.2022 21:57

@Cyan Нет проблем. Я также добавил версию, которая будет обрабатывать, если list_ имеет значения, которых нет в исходной карте.

NathanOliver 22.04.2022 21:59

@NathanOliver Я также заметил, что порядок элементов на новой карте будет обратным, как {"E": 5, "D": 4, "B": 2}.

Cyan 22.04.2022 22:06

@Cyan std::map — это отсортированный контейнер. Он сортирует свои ключи, используя operator< по умолчанию, поэтому в этом случае он использует std::string::operator<, который не будет ставить "E" перед "D" или "D" перед "B" и т. д. Возможно, вы просто отображение карту в обратном порядке?

Remy Lebeau 22.04.2022 22:07

@ Натан Оливер, ты прав! Я действительно хочу, чтобы порядок соответствовал списку. Например, если мой список {"E", "B", "D"}, то я хочу, чтобы новая карта была {"E": 5, "B": 2, "D": 4}. Извините, что пропустил эту часть.

Cyan 22.04.2022 22:11

@Cyan Обе карты должны иметь одинаковый порядок, здесь они: coliru.stacked-crooked.com/a/6663f95baa69b7bf

NathanOliver 22.04.2022 22:11

@Cyan Это не то, что ты можешь иметь. map хранит свои элементы в отсортированном виде.

NathanOliver 22.04.2022 22:12

@Cyan "Я действительно хочу, чтобы порядок соответствовал списку" - Вы не можете выполнить такой заказ с помощью std::map (ну, во всяком случае, не без специального компаратора). В этом случае вы должны использовать вместо этого std::vector<std::pair<std::string, int>>, тогда вы можете добавлять к нему элементы в любом порядке.

Remy Lebeau 22.04.2022 22:12

@RemyLebeau Понял! Правильно, я только что понял, что мне не нужно заботиться о порядке. Спасибо вам обоим!

Cyan 22.04.2022 22:12

Другие вопросы по теме