Многомерные массивы

Последнее обновление: 22.02.2023

Каждый массив имеет такую характеристику как размерность. Количество размерностей соотвествует числу пар квадратных скобок. Например:

int numbers[3];

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

Но кроме одномерных массивов в C++ есть и многомерные. Элементы таких массивов сами в свою очередь являются массивами, в которых также элементы могут быть массивами. Как правило, распространены двухмерные и трехмерные массивы. Например, определим двухмерный массив чисел:

int numbers[3][2];

Здесь массив numbers имеет две размерности (две пары квадратных скобок): первая размерность равна 3, а вторая размерность - 2. Такой массив состоит из трех элементов, при этом каждый элемент представляет массив из двух элементов. Двухмерный массив еще можно представить в виде таблицы, где первая размерность представляет количество строк, а вторая размерность - количество столбцов.

Подобным образом можно определять массивы и с большим количеством размерностей, например, трехмерный массив:

int numbers[3][2][2];

Как и в общем случае многомерный массив можно инициализировать некоторыми значениями, например, нулями:

int numbers[3][2] {};

Также можно инициализировать все элементы индивидуальными значениями. Так, массив numbers состоит из трех элементов (строк), каждый из которых представляет массив из двух элементов (столбцов). Поэтому такой массив мы можем проинициализировать, например, следующим образом:

int numbers[3][2] 
{ 
    {1, 2},     // первая строка
    {4, 5},     // вторая строка
    {7, 8}      // третья строка
};

Вложенные фигурные скобки очерчивают элементы для каждого подмассива. Такой массив еще можно представить в виде таблицы:

12
45
78

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

int numbers[3][2] { {1, 2}, {}, {7} };

В этом случае значения присваиваются первым элементам массивов, а остальные элементы инициализируются нулями.

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

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

Обращение к элементам

И чтобы обратиться к элементам многомерного массива, потребуется индексы для каждой размерности. Так, если речь идет о двухмерном массиве, нам надо указать индексы для обоих его размерностей:

#include <iostream>
 
int main()
{   
    int nums[3][2] 
    { 
        {1, 2}, 
        {3, 4}, 
        {5, 6} 
    };
    // получаем значение элемента
    int n = nums[1][0];     // вторая строка, первый столбец
    std::cout << "n =" << n << std::endl;       // n = 3

    std::cout << "nums[2][1] = " << nums[2][1] << std::endl;   // nums[2][1] = 6 
    // изменяем значение элемента
    nums[2][1] = 123;       // третья строка, второй столбец
    std::cout << "nums[2][1] = " << nums[2][1] << std::endl;   // nums[2][1] = 123 
}

Здесь массив nums можно разобрать по индексам следующим образом:

nums[0][0]nums[0][1]
nums[0]12
nums[1][0]nums[1][1]
nums[1]34
nums[2][0]nums[2][1]
nums[2]56

Соответственно выражение nums[1][0] представляет обращение к первому элементу второго подмассива (первый столбец второй строки)

Перебор многомерного массива

Переберем двухмерный массив:

#include <iostream>

int main()
{
	const int rows = 3, columns = 2;
	int numbers[rows][columns]  { {1, 2}, {3, 4}, {5, 6} };
	for(int i=0; i < rows; i++)
	{
		for(int j=0; j < columns; j++)
		{
			std::cout << numbers[i] [j] << "\t";
		}
		std::cout << std::endl;
	}
}

Также для перебора элементов многомерного массива можно использовать другую форму цикла for, которая специально предназначена для перебора последовательностей:

#include <iostream>

int main()
{
	const int rows = 3, columns = 2;
	int numbers[rows][columns]  { {1, 2}, {3, 4}, {5, 6} };
	
	for(auto &subnumbers : numbers)
	{
		for(int number : subnumbers)
		{
			std::cout << number << "\t";
		}
		std::cout << std::endl;
	}
}

Для перебора массивов, которые входят в массив, применяются ссылки. То есть во внешнем цикле for(auto &subnumbers : numbers) &subnumbers представляет ссылку на подмассив в массиве. Во внутреннем цикле for(int number : subnumbers) из каждого подмассива в subnumbers получаем отдельные его элементы в переменную number и выводим ее значение на консоль.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850