std::vector
to klasa szablonów, która obudowuje tablicę dynamiczną 1 , przechowywaną w stercie, która rośnie i kurczy się automatycznie po dodaniu lub usunięciu elementów. Zapewnia wszystkie haki ( begin()
, end()
iteratory itp.), Które sprawiają, że działa dobrze z resztą STL. Ma również kilka przydatnych metod, które pozwalają wykonywać operacje, które na normalnej tablicy byłyby uciążliwe, takie jak np. Wstawianie elementów na środku wektora (obsługuje całą pracę związaną z przenoszeniem następujących elementów za kulisy).
Ponieważ przechowuje elementy w pamięci przydzielone na stercie, ma pewne obciążenie w stosunku do tablic statycznych.
std::array
to klasa szablonów, która obudowuje tablicę o rozmiarze statycznym, przechowywaną wewnątrz samego obiektu, co oznacza, że jeśli utworzysz instancję klasy na stosie, sama tablica będzie na stosie. Jego rozmiar musi być znany w czasie kompilacji (jest przekazywany jako parametr szablonu) i nie może się powiększać ani zmniejszać.
Jest bardziej ograniczony niż std::vector
, ale często bardziej wydajny, szczególnie w przypadku małych rozmiarów, ponieważ w praktyce jest to głównie lekkie opakowanie wokół tablicy w stylu C. Jest to jednak bezpieczniejsze, ponieważ niejawna konwersja na wskaźnik jest wyłączona, i zapewnia wiele funkcji związanych z STL std::vector
innych kontenerów, dzięki czemu można go łatwo używać z algorytmami i współpracownikami STL. W każdym razie, dla samego ograniczenia stałego rozmiaru, jest on znacznie mniej elastyczny niż std::vector
.
Aby std::array
zapoznać się ze wstępem , zapoznaj się z tym artykułem ; w celu szybkiego wprowadzenia std::vector
i możliwych operacji na nim możesz zajrzeć do jego dokumentacji .
Właściwie myślę, że w standardzie są one opisane w kategoriach maksymalnej złożoności różnych operacji (np. Losowy dostęp w stałym czasie, iteracja wszystkich elementów w czasie liniowym, dodawanie i usuwanie elementów na końcu w stałym zamortyzowanym czasie, itp.), ale AFAIK nie ma innej metody spełnienia takich wymagań niż użycie dynamicznej tablicy. Jak stwierdził @Lucretiel, norma faktycznie wymaga, aby elementy były przechowywane w sposób ciągły, więc jest to tablica dynamiczna, przechowywana tam, gdzie umieszcza ją przypisany alokator.
std::vector
vsstd::array
i tego, jak różnią się warunki.