Как я могу инициализировать 2d массив со списком 1d массивов? - PullRequest
0 голосов
/ 09 января 2019

Как я могу инициализировать 2d массив со списком 1d массивов?

void main()
{
    int a[] = { 1,2,3 };
    int b[] = { 4,5,6 };
    int array[][3] = { a,b };
}

Ответы [ 4 ]

0 голосов
/ 09 января 2019

std::array - это путь, но если вы хотите использовать средства языка (а не стандартную библиотеку lib), и ваш объединенный массив будет иметь то же время жизни, что и его составляющие, и если данные можно поделиться, вы можете иметь массив указателей на массивы и сказать

int a[] { 1,2,3 };
int b[] { 4,5,6 };

decltype(a) *abArr[] {&a, &b};
// equivalent to 
// int (*abArr[])[3] { &a, &b };

Обратите внимание, что это не двумерный массив, и его элементы не являются целыми числами. Но вы все равно можете выполнять циклический диапазон в обоих измерениях, потому что указатели являются истинными указателями на массив фиксированного размера (в отличие от указателей на просто int в результате распада массива, который не может быть зациклен на диапазоне).

Поскольку элементы массива являются указателями, необходимо разыменовать row:

for (auto const& row : abArr)
    for (auto const& e : *row)
        cout << e << " ";

Живой пример: http://coliru.stacked -crooked.com / a / cff8ed0e69ffb436

0 голосов
/ 09 января 2019

сырые массивы в C ++ - это люди второго сорта. Они не могут быть назначены и не могут быть скопированы, что означает, что вы не можете использовать их для инициализации других массивов, и их имя в большинстве случаев превращается в указатель.

Lucky C ++ 11 предлагает решение. std::array действует как необработанный массив, но у него нет недостатков. Вместо этого вы можете использовать их для создания двумерного массива, например

std::array<int, 3> foo = {1,2,3};
std::array<int, 3> bar = {3,4,5};
std::array<std::array<int, 3>, 2> baz = {foo, bar};

и, если у вас есть поддержка C ++ 17, вы можете использовать вычет аргумента шаблона класса , чтобы избавиться от необходимости указывать параметры шаблона, а код упрощается до

std::array foo = {1,2,3};
std::array bar = {3,4,5};
std::array baz = {foo, bar};

, который вы можете увидеть, работая в этом живом примере

0 голосов
/ 09 января 2019

Как вы представили - совсем нет ... Вы можете иметь:

int array[][3] = { { 1, 2, 3 }, { 4, 5, 6 } };

Если вам все еще нужны a и b, вы можете использовать их в качестве указателей:

int* a = array[0];
int* b = array[1];

или чуть ближе к исходной попытке: ссылки на массив:

int(&a)[3] = array[0];
int(&b)[3] = array[1];

Таким образом, вы все еще можете e. г. применить sizeof к a и b ...

Или наоборот: создайте массив указателей

int a[] = { 1,2,3 };
int b[] = { 4,5,6 };
int* array[] = { a, b };

Все эти решения, представленные до сих пор, имеют общее, что и a, и array [0] имеют доступ к одним и тем же данным. Если вы на самом деле хотите иметь две независимые копии вместо этого, то нет никакого способа скопировать данные из одной в другую, e. г. через std::copy.

Если вы переключитесь с необработанного массива на std::array, то у вас может напрямую иметь этот тип инициализации (с копиями):

std::array<int, 3> a;
std::array<int, 3> b;
std::array<std::array<int, 3> 2> array = { a, b };
0 голосов
/ 09 января 2019

Использование std::array.

auto a = std::array{ 1,2,3 };
auto b = std::array{ 4,5,6 };
auto array = std::array{ a,b };

Демо

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