Елементи масиву можуть бути будь-якого типу даних, навіть масиву!
Багатовимірні масиви
Масив масивів називається багатовимірним масивом:
1 |
int array[2][4]; // 2-елементний масив з 4-елементних масивів |
Оскільки у нас є 2 індекси, то це двовимірний масив.
У двовимірному масиві перший (лівий) індекс прийнято читати як кількість рядків, а другий (правий) як кількість стовпців. Вищенаведений масив можна представити наступним чином:
[0][0] [0][1] [0][2] [0][3] // рядок №0
[1][0] [1][1] [1][2] [1][3] // рядок №1
Щоб отримати доступ до елементів двовимірного масиву, просто використовуйте 2 індекси:
1 |
array[1][3] = 7; // без приставки int (типу даних) |
Ініціалізація двовимірних масивів
Для ініціалізації двовимірного масиву найпростіше використовувати вкладені фігурні дужки, де кожен набір значень відповідає певному рядку:
1 2 3 4 5 6 |
int array[3][5] = { { 1, 2, 3, 4, 5 }, // рядок №0 { 6, 7, 8, 9, 10 }, // рядок №1 { 11, 12, 13, 14, 15 } // рядок №2 }; |
Хоча деякі компілятори можуть дозволити вам пропустити внутрішні фігурні дужки, все ж рекомендується вказувати їх у будь-якому випадку: поліпшується читабельність і зменшується ймовірність отримання незапланованих нульових елементів масиву через те, що C++ замінює відсутні ініціалізатори значенням 0
:
1 2 3 4 5 6 |
int array[3][5] = { { 2, 4 }, // рядок №0 = 2, 4, 0, 0, 0 { 1, 3, 7 }, // рядок №1 = 1, 3, 7, 0, 0 { 8, 9, 11, 12 } // рядок №2 = 8, 9, 11, 12, 0 }; |
У двовимірному масиві зі списком ініціалізаторів можна не вказувати тільки лівий індекс (довжину масиву):
1 2 3 4 5 6 |
int array[][5] = { { 1, 2, 3, 4, 5 }, { 6, 7, 8, 9, 10 }, { 11, 12, 13, 14, 15 } }; |
Компілятор може сам обчислити кількість рядків в масиві. Однак не вказувати два індекси — це вже помилка:
1 2 3 4 5 |
int array[][] = { { 3, 4, 7, 8 }, { 1, 2, 6, 9 } }; |
Подібно звичайним масивам, багатовимірні масиви можна ініціалізувати значенням 0
наступним чином:
1 |
int array[3][5] = { 0 }; |
Зверніть увагу, що це працює тільки в тому випадку, якщо ви явно оголошуєте довжину масиву (вказуєте лівий індекс)! В протилежному випадку, ви отримаєте двовимірний масив з 1 рядком.
Доступ до елементів у двовимірному масиві
Для доступу до всіх елементів двовимірного масиву потрібно два цикли: один для рядків і один для стовпців. Оскільки доступ до двовимірних масивів зазвичай виконується по рядкам, то лівий індекс використовується в якості зовнішнього циклу:
1 2 3 |
for (int row = 0; row < numRows; ++row) // доступ по рядкам for (int col = 0; col < numCols; ++col) // доступ до кожного елементу в рядку std::cout << array[row][col]; |
Багатовимірні масиви більше двох вимірів
Багатовимірні масиви можуть бути більше двох вимірів. Наприклад, оголошення тривимірного масиву:
1 |
int array[4][3][2]; |
Тривимірні масиви важко ініціалізувати будь-яким інтуїтивним способом з використанням списку ініціалізаторів, тому краще ініціалізувати весь масив значенням 0
і явно присвоювати значення за допомогою вкладених циклів.
Доступ до елементів тривимірного масиву здійснюється так само, як і до елементів двовимірного масиву:
1 |
std::cout << array[3][2][1]; |
Приклад двовимірного масиву
Розглянемо приклад використання двовимірного масиву:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#include <iostream> int main() { // Оголошуємо масив 10x10 const int numRows = 10; const int numCols = 10; int product[numRows][numCols] = { 0 }; // Створюємо таблицю множення for (int row = 0; row < numRows; ++row) for (int col = 0; col < numCols; ++col) product[row][col] = row * col; // Виводимо таблицю множення for (int row = 1; row < numRows; ++row) { for (int col = 1; col < numCols; ++col) std::cout << product[row][col] << "\t"; std::cout << '\n'; } return 0; } |
Ця програма обчислює і виводить таблицю множення від 1 до 9 (включно). Зверніть увагу, при виведенні таблиці в циклі for ми починаємо з 1 замість 0. Це робиться з метою запобігання виведенню нульового рядка з нульовими стовпцями, щоб в результаті у нас не було рядка з одними нулями!
Результат виконання програми:
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
Двовимірні масиви зазвичай використовуються в іграх типу tile-based, де кожен елемент масиву представляє собою один фрагмент/плитку. Вони також використовуються в комп’ютерній 3D-графіці (у вигляді матриць) для обертання, масштабування і відображення фігур.