Tablice
Tablice w programowaniu to struktury danych umożliwiające przechowywanie wielu wartości tego samego typu w sposób ciągły w pamięci. W języku C++ tablice są jednym z najprostszych i najczęściej używanych sposobów organizacji danych, szczególnie gdy liczba elementów jest znana w momencie kompilacji. Tablica pozwala na szybki dostęp do elementów poprzez indeksowanie, co jest wydajne zarówno czasowo, jak i pamięciowo. Tablica C++ to narzędzie zarówno do podstawowych operacji na danych, jak i do bardziej złożonych algorytmów, a zrozumienie jej działania jest niezbędne przy pracy z językiem. W niniejszych notatkach zostanie szczegółowo omówione tworzenie tablic, ich inicjalizacja, operacje na elementach oraz uzupełnienie tablic.
Spis treści
Podstawowe informacje o tworzeniu tablic C++ i sposobach deklaracji tablic jednowymiarowych
Tworzenie tablic w C++ zaczyna się od określenia typu elementów, z których tablica będzie się składać, oraz liczby elementów. Składnia deklaracji tablicy jednowymiarowej wygląda następująco:
typ_nazwy tablica[n];
gdzie typ_nazwy to typ przechowywanych danych (np. int, double, char), tablica jest nazwą zmiennej, a n jest liczbą elementów.
Przykład deklaracji tablicy liczb całkowitych o pięciu elementach:
int liczby[5];
Elementy tablicy są indeksowane od zera, co oznacza, że pierwszy element ma indeks 0, a ostatni indeks n-1. Wartości w tablicy mogą być zainicjalizowane w momencie deklaracji:
int liczby[5] = {1, 2, 3, 4, 5};Jeżeli podamy mniej elementów niż rozmiar tablicy, pozostałe elementy zostaną automatycznie ustawione na wartość zerową (dla typów podstawowych). Warto pamiętać, że w C++ deklaracja tablicy o zmiennym rozmiarze nie jest standardowa (chyba że używa się tablic dynamicznych lub std::vector).
Przykład inicjalizacji częściowej:
int liczby[5] = {1, 2}; // elementy 2,3,4 będą 0Operacje na tablicach C++ obejmujące odczyt, zapis i iterowanie po elementach
Dostęp do elementów tablicy odbywa się poprzez operator indeksowania []. Wartość elementu można odczytać lub przypisać nową wartość:
int x = liczby[2]; // pobranie trzeciego elementu
liczby[0] = 10; // zmiana wartości pierwszego elementu
Typową operacją jest iteracja po wszystkich elementach tablicy przy użyciu pętli for:
for(int i = 0; i < 5; i++) {
liczby[i] = i * 2; // wypełnienie tablicy wartościami
}Ważne jest, aby nie przekraczać indeksów tablicy, ponieważ w C++ nie ma kontroli zakresu indeksów przy użyciu zwykłych tablic statycznych. Próba dostępu do elementu spoza zakresu może prowadzić do niezdefiniowanego zachowania i nadpisania pamięci.
Tworzenie tablic wielowymiarowych w C++ i zasady uzupełniania tablic dwuwymiarowych
Tablice wielowymiarowe w C++ są rozszerzeniem idei tablic jednowymiarowych. Najczęściej spotykane są tablice dwuwymiarowe, które można traktować jak macierz:
typ_nazwy tablica[wymiar1][wymiar2];
Przykład deklaracji tablicy 3×4 przechowującej liczby całkowite:
int macierz[3][4];
Uzupełnienie tablic dwuwymiarowych można wykonać zarówno element po elemencie, jak i w pełnej inicjalizacji:
int macierz[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};Dostęp do elementów tablicy dwuwymiarowej odbywa się poprzez dwa indeksy:
int y = macierz[1][2]; // pobranie elementu z drugiego wiersza, trzeciej kolumny
macierz[0][0] = 42; // zmiana wartości pierwszego elementu
Iterowanie po tablicy dwuwymiarowej wymaga zazwyczaj dwóch pętli zagnieżdżonych:
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 4; j++) {
macierz[i][j] = i + j; // proste wypełnienie
}
}Dla większych wymiarów należy pamiętać, że liczba elementów rośnie wykładniczo, co może prowadzić do szybkiego zużycia pamięci, szczególnie przy tablicach statycznych.
Tablica C++ dynamiczna i zasady przydzielania pamięci oraz uzupełnienie tablic w czasie działania programu
Statyczne tablice w C++ mają stały rozmiar ustalany w czasie kompilacji. W przypadku gdy liczba elementów jest znana dopiero w czasie działania programu, konieczne jest użycie tablic dynamicznych. Przydzielenie pamięci wykonuje się za pomocą operatora new:
int* dynamiczna = new int[n];
Elementy tablicy dynamicznej można inicjalizować tak samo jak zwykłe tablice:
for(int i = 0; i < n; i++) {
dynamiczna[i] = i * 3;
}Po zakończeniu korzystania z tablicy dynamicznej należy pamiętać o zwolnieniu pamięci:
delete[] dynamiczna;
Brak tej operacji prowadzi do wycieków pamięci. Tablice dynamiczne pozwalają także na tworzenie tablic wielowymiarowych poprzez dynamiczną alokację tablic wskaźników, ale wtedy konieczna jest ręczna alokacja i zwolnienie każdego wymiaru.
Przykłady zastosowania tablic C++ w różnych językach programowania dla utrwalenia koncepcji
- C++ – jednowymiarowa tablica liczb całkowitych:
#include <iostream>
using namespace std;int main() {
int tab[5] = {1, 2, 3, 4, 5};
for(int i = 0; i < 5; i++) {
cout << tab[i] << " ";
}
return 0;
}
- C – podobnie jak w C++:
#include <stdio.h>int main() {
int tab[5] = {1, 2, 3, 4, 5};
for(int i = 0; i < 5; i++) {
printf("%d ", tab[i]);
}
return 0;
}- Python – lista jako odpowiednik tablicy:
tab = [1, 2, 3, 4, 5]
for i in range(len(tab)):
print(tab[i], end=" ")
- PHP – tablica indeksowana numerycznie:
<?php
$tab = array(1, 2, 3, 4, 5);
for ($i = 0; $i < count($tab); $i++) {
echo $tab[$i] . " ";
}
?>
Uwagi praktyczne dotyczące stosowania tablic C++ i typowe pułapki przy uzupełnianiu tablic
- Przekroczenie zakresu indeksu prowadzi do niezdefiniowanego zachowania i może nadpisać pamięć.
- Tablice statyczne muszą mieć rozmiar znany w czasie kompilacji; w przeciwnym razie należy użyć tablic dynamicznych lub
std::vector. - Przy tablicach dynamicznych konieczne jest zwolnienie pamięci, inaczej wystąpią wycieki.
- W przypadku tablic wielowymiarowych pamiętać, że pamięć jest ciągła dla pierwszego wymiaru, ale przy dynamicznych tablicach wskaźników – niekoniecznie.
- W C++11 i nowszych możliwe jest użycie list inicjalizacyjnych
{}do wygodnego uzupełniania tablic.
Tablice C++ stanowią fundament zarówno dla prostych programów, jak i bardziej złożonych struktur danych, takich jak stosy, kolejki czy macierze w algorytmach numerycznych. Opanowanie tworzenia tablic, iteracji po elementach i prawidłowego uzupełnienia tablic jest kluczowe dla efektywnego programowania w C++.