Jak sam powiedziałeś, std::dynarray
dotyczy tablicy dynamicznej o stałym rozmiarze . Nie można zmieniać rozmiaru. To z grubsza rzecz biorąc poprawę w ciągu new T[N]
i nad std::unique_ptr<T[]>(new T[N])
.
Brak konieczności zmiany rozmiaru lub zarządzania pojemnością oznacza, że możesz wdrożyć strukturę danych z mniejszą złożonością i mniejszą przestrzenią.
Co więcej, std::dynarray
jest dziwnym zwierzęciem, które pozwala implementacji zaimplementować go na różne, niespecyficzne sposoby, np. Można umieścić tablicę na stosie. Wywołanie funkcji alokacji jest „opcjonalne”. Możesz określić alokator do konstruowania elementów tablicy, ale nie jest to część typu.
Można również zastanawiać się, dlaczego musimy std::dynarray
i tablice o zmiennej długości. Umowy VLA w C ++ 14 są znacznie bardziej restrykcyjne; mogą być tylko lokalnymi, automatycznymi zmiennymi i nie oferują możliwości określenia zasad alokacji i oczywiście nie mają standardowego interfejsu kontenera.
Kilka przykładów z 23.3.4.2 „bieżącej wersji roboczej” (weź to, pamięć podręczna Google):
explicit dynarray(size_type c);
Efekty: Przydziela miejsce na c
elementy. Może wywoływać plik global operator new
.
template <class Alloc>
dynarray(size_type c, const Alloc& alloc);
Efekty: równoważne z poprzednimi konstruktorami, z tą różnicą, że każdy element jest konstruowany z konstrukcją use-alokator .
To, czy możesz użyć danego alokatora do skonstruowania elementów tablicy, jest cechą globalną:
szablon struct uses_allocator, Alloc>: true_type {};
Wymaga: Alloc
musi być alokatorem (17.6.3.5). [ Uwaga: Specjalizacja tej cechy informuje inne komponenty biblioteki, które dynarray
można skonstruować za pomocą alokatora, nawet jeśli nie ma ona zagnieżdżonego alokatora_type.]
Edycja: odpowiedź Jonathana Wakely'ego z pewnością będzie znacznie bardziej autorytatywna i wnikliwa.