Bardzo dobre pytanie, szczególnie jak zadaje je początkujący. Masz 100% racji, że należy używać std::array
.
Wyjaśnienie tego stanu rzeczy jest proste:
Zgoda
- niektórzy nie potrafią zmienić przyzwyczajeń
Też prawda...
[...]
Nie zawsze i nie do końca...
Uczę zarówno podstaw programowania jak i programowania obiektowego. Zastanawiałem się bardzo poważnie nad wprowadzeniem na podstawach programowania std:array jako podstawowego używanego typu "tablicowego" i po analizie wszystkich za i przeciw - zrezygnowałem... Zostałem przy zwykłych tablicach i std::vector (z mocną sugestią, żeby używali tego drugiego).
Co daje uczniowi std::array ?
a) może go przekazać do funkcji przez wartość/referencje i może go zwrócić z funkcji
b) może sprawdzić jego rozmiar
c) może dla niego uzyć operatora przypisania
d) mógłby użyć .at() zamiast [] - ale tego prawie żaden nie robi i tak ;)
Tyle, że wszystko to dostanie też w przypadku std::vector - a na etapie nauki podstaw - kwestia tego gdzie i jak dane będą alokowane nie ma najmniejszego znaczenia.
Z drugiej strony - jaki jest "koszt" użycia std::array ? Przede wszystkim to koszt nauki kompletnie nowej składni, na etapie gdzie wszystko jest nowe i niezrozumiałe. Co gorsza - jest to składnia, która potem przez długi czas do niczego innego im się nie przyda.
W przypadku wektora jest jeden "magiczny" moment - kiedy trzeba powiedzieć, że typ przechowywanych wartości wpisujemy w nawiasach trójkątnych a nie na początku jak we wszystkich innych deklaracjach.
W przypadku array - nie tylko typ ale i rozmiar (ok, to jeszcze ujdzie, w wektorze też jest inaczej niż dla zwykłej tablicy).
Tylko potem jest gorzej - funkcję do której przekazujemy wektor konkretnego typu piszemy tak jak dowolną inną funkcję. A w przypadku std::array musimy w praktyce wprowadzać od razu prawie pełną składnię szablonów.
Moim zdaniem to nie jest coś strawnego dla przeciętnego początkującego programisty. Nie mówię tu o osobach bardzo zdolnych, które trafiły na elitarne studia informatyczne. Dla typowego początkującego programisty, który na studia "okołoinformatyczne" trafił po przeciętnym liceum/technikum problemem jest napisanie już zwykłej funkcji.
Kolejna sprawa - dla początkującego programisty problemem są nawet najbardziej czytelne i oczywiste komunikaty błędów kompilatora lub linkera. W przypadku szablonów sytuacja jest już o niebo lepsza niż kilka(naście?) lat temu (kto pamięta aplikację do tłumaczenia komunikatów błędów g++ na coś bardziej zrozumiałego? ), ale... Potraficie z ręką na sercu wymienić choć jeden kompilator, który w nietrywialnym programie dla kodu generycznego ma krótkie i łatwe do zrozumienia komunikaty błędów ?
TL;DR;
Łatwo jest mówić, że atd::array jest lepszy od zwykłej tablicy, jak już się potrafi programować ;)
PS
Chętnie dam się przekonać, że nie mam racji ;)
Ten film oczywiście widziałem i z większością się zgadzam.