Как получить доступ к внутренним значениям карты С++

Это моя карта std::map<std::string,ProductInfo> mymap и вот значения внутри ProductInfo:

bool isActive = false;
char name[80];

Я уже могу получить доступ к определенной паре ключ-значение (std::string - ProductInfo) с помощью ::iterator, но на самом деле мне нужно свойство name внутри ProductInfo

также так выглядит ProductInfo во время отладки

mymap["some key"].name?
Ayxan Haqverdili 17.05.2022 12:02

Вы знаете, что итератор «указывает» на std::pair, содержащий ключ и значение? И что ценность находится в second члене пары? И что это фактическое значение данных? Теперь, как вы думаете, вы могли бы получить доступ к членам вашей структуры?

Some programmer dude 17.05.2022 12:02
Формы 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.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
2
57
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Предполагая, что у вас есть карта:

std::map<KeyT, ValueT> m;

Значение, на которое указывают ваши итераторы, определяется как:

using value_type = std::pair<KeyT const, ValueT>;

Таким образом, вы используете pair::second для отображаемого значения:

auto it = m.find("some key");
if (it != m.end()) {
  std::cout << "name: " << it->second.name << '\n';
}
Ответ принят как подходящий

Вы хотите получить доступ к свойству name объекта ProductInfo внутри карты. Что вам нужно сделать, так это your_map["the key"]->get_name(), где get_name() — геттер для name в ProductInfo.

Это неверно и не будет компилироваться.

Anoop Rana 17.05.2022 12:19

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

mrjamaisvu 17.05.2022 12:47

Я не ОП. Я не принял ваш ответ. ОП и я разные люди. Вы меня с ОПом спутали?

Anoop Rana 17.05.2022 12:50

Доступ к ключу std::map с помощью operator[] дает нам отображаемый тип, который совпадает с ProductInfo в вашем примере. Это означает, что вы можете получить доступ к члену данных name, используя оператор доступа к члену, как показано ниже:

//-----------------------------vvvv---->use member access operator
std::cout << mymap["some key"].name; 

Если вы предоставили геттеры для ProductInfo, вы можете использовать этот геттер, как показано ниже:

std::cout << mymap["some key"].get_name();

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

Чтобы зациклиться на контейнерах, не используйте итераторы (или индексы), если в этом нет явной необходимости, а используйте циклы for на основе диапазона (https://en.cppreference.com/w/cpp/language/range-for). Основанные на диапазоне более удобочитаемы и предотвращают случайный доступ вне границ.

Для удобочитаемости кода вы можете использовать структурированные привязки (https://en.cppreference.com/w/cpp/language/structured_binding) следующим образом:

#include <iostream>
#include <map> // or unordered_map for faster access
#include <string>

struct ProductInfo
{
    std::size_t id;
};

int main()
{
    // initialize map with 3 entries
    std::map<std::string, ProductInfo> m_products
    {
        {"one",{1}},
        {"two",{2}},
        {"three",{3}}
    };

    // range based for loop with structured bindings
    for (const auto& [key, product_info] : m_products)
    {
        std::cout << "key = " << key << ", value = " << product_info.id << "\n";
    }

    return 0;
}

Также не используйте оператор индекса [], как указано выше. Но используйте по адресу: https://en.cppreference.com/w/cpp/container/map/at. Оператор [] будет вставлять данные, если данные не найдены, и это часто приводит к ошибкам. Функция at будет возвращать данные только в том случае, если они действительно существуют внутри карты.

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