Невозможно перебрать значение hashmap, являющегося списком - PullRequest
0 голосов
/ 04 июня 2019

Я пытаюсь написать очень простую и банальную программу, в которой пользователю предлагается ввести имя трех животных и трех измерений (рост, вес и возраст).Я хочу сохранить это как Hashmap вида {"animal": {рост, вес, возраст}}.

Когда я пытаюсь перебрать значения ключа (имя животного), это работает, но проблема заключается в том, что когда дело доходит до перебора ключа.Проблема сводит меня с ума, так как я не понимаю таких понятий, как перегрузка для итератора и т. Д., Которые я видел в других статьях, как способ изменить свой код, чтобы он мог перебирать второе значение для каждого ключа вмой хэшмэп

Вот мой код:

#include <iostream>
#include <string>
#include <map>
#include <list>


using namespace std;


int main(){


   map <string, list<float>> measurements;

    for(int i=1; i<=3; i++){
       string name;
       float height, weight, age;
       cout << "Please enter the animals' name: " << i << endl;
       cin >> name;
       cout << "Enter the height, weight, age" << endl;
       cin >> height >> weight >> age;
       measurements[name] = {height, weight, age};
    } 
    for (auto x: measurements) {
        cout << x.first << endl;

        cout << x.second << endl;
        }


    return 0;
}

1 Ответ

3 голосов
/ 04 июня 2019

Для std::list нет оператора вывода (operator<<), так же как для std::map нет оператора вывода.Таким же образом, выполняя итерацию карты, вы можете выполнять итерацию списка:

for (const auto& x: measurements) {
    std::cout << x.first << "\n";
    for (const auto& y : x.second) {
        std::cout << y << "\n";
    }
}

Я заменил auto на const auto&, потому что только в случае auto тип выводится как тип значения итогда x является копией элементов на карте.Эту копию можно избежать, используя const auto&, тогда x является (const) ссылкой на элементы на карте.

...