Многомерный массив для хранения трех разных типов данных? - PullRequest
0 голосов
/ 17 июня 2020

У меня есть набор из трех пар значений, которые я хочу сохранить в массиве, каждое значение с разным типом.

[string][int][double] для хранения таких вещей, как [John][12][40.025] [Amy][20][16000.411], и я хочу быть возможность получать значения по местоположению. Какой контейнер мне следует использовать?

Я просмотрел много ответов, но большинство из них касалось двух типов данных, и я не знаю, какой из них лучше подходит для моего случая.

Ответы [ 2 ]

3 голосов
/ 17 июня 2020

Вот для чего нужны классы:

struct data {
    std::string name;
    int         name_describing_this_variable;
    double      another_descriptive_name;
};

Вы можете хранить экземпляры этого класса в массиве:

data arr[] {
    {"John", 12, 40.025},
    {"Amy",  20, 16000.411},
};
2 голосов
/ 17 июня 2020

Используйте шаблон класса std::tuple, объявленный в заголовке <tuple>. Например,

#include <iostream>
#include <string>
#include <tuple>

int main() 
{
    std::tuple<std::string, int, double> t ={ "John", 12, 40.025 };

    std::cout << std::get<0>( t ) << ", "
              << std::get<1>( t ) << ", "
              << std::get<2>( t ) << '\n';

    std::cout << std::get<std::string>( t ) << ", "
              << std::get<int>( t ) << ", "
              << std::get<double>( t ) << '\n';

    return 0;
}

Вывод программы:

John, 12, 40.025
John, 12, 40.025

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

Например

#include <iostream>
#include <string>
#include <tuple>

int main() 
{
    std::tuple<std::string, int, double> t[1];

    t[0] = { "John", 12, 40.025 };

    std::cout << std::get<0>( t[0] ) << ", "
              << std::get<1>( t[0] ) << ", "
              << std::get<2>( t[0] ) << '\n';

    std::cout << std::get<std::string>( t[0] ) << ", "
              << std::get<int>( t[0] ) << ", "
              << std::get<double>( t[0] ) << '\n';

    return 0;
}

В качестве альтернативы вы можете определить свой собственный составной тип (класс или структуру), который будет содержать подобъекты требуемых типов.

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