Nie mogę wystarczająco mocno pogodzić się z duchem przyjętej odpowiedzi. „Narzędzie ostateczności”? Daleko stąd!
Według mnie jedną z najsilniejszych cech C ++ w porównaniu do C i niektórych innych podobnych języków jest zdolność do wyrażania ograniczeń, aby można je było sprawdzić w czasie kompilacji i zapobiec przypadkowemu niewłaściwemu użyciu. Podczas projektowania konstrukcji zadaj sobie pytanie, na jakie operacje powinna ona zezwalać. Wszelkie inne zastosowania powinny być zabronione, a najlepiej, jeśli takie ograniczenia można wdrożyć statycznie (w czasie kompilacji), aby niewłaściwe użycie skutkowało niepowodzeniem kompilacji.
Kiedy więc potrzebna jest tablica, odpowiedzi na następujące pytania określają jej zachowanie: 1. Czy jej rozmiar a) jest dynamiczny w czasie wykonywania lub b) statyczny, ale znany tylko w czasie wykonywania, lub c) statyczny i znany w czasie kompilacji? 2. Czy tablicę można przydzielić na stosie, czy nie?
I na podstawie odpowiedzi jest to, co uważam za najlepszą strukturę danych dla takiej tablicy:
Dynamic | Runtime static | Static
Stack std::vector unique_ptr<T[]> std::array
Heap std::vector unique_ptr<T[]> unique_ptr<std::array>
Tak, myślę, że unique_ptr<std::array>
należy również wziąć pod uwagę, i żadne z nich nie jest narzędziem ostateczności. Pomyśl, co najlepiej pasuje do Twojego algorytmu.
Wszystkie z nich są kompatybilne ze zwykłymi interfejsami API języka C za pomocą surowego wskaźnika do tablicy danych ( vector.data()
/ array.data()
/ uniquePtr.get()
).
PS Oprócz powyższych rozważań, istnieje również własność: std::array
i std::vector
mają semantykę wartości (mają natywne wsparcie dla kopiowania i przekazywania według wartości), podczas gdy unique_ptr<T[]>
mogą być przenoszone tylko (wymusza pojedyncze prawo własności). Oba mogą być przydatne w różnych scenariuszach. Wręcz przeciwnie, zwykłe tablice statyczne ( int[N]
) i zwykłe tablice dynamiczne ( new int[10]
) nie oferują żadnego z nich i dlatego należy ich unikać, jeśli to możliwe - co powinno być możliwe w zdecydowanej większości przypadków. Jeśli to nie wystarczy, zwykłe tablice dynamiczne również nie oferują możliwości sprawdzenia ich wielkości - dodatkowa szansa na uszkodzenie pamięci i dziury w zabezpieczeniach.
std::shared_ptr<T[]>
, ale powinno być i prawdopodobnie będzie w C ++ 14, jeśli ktokolwiek będzie miał problem z napisaniem propozycji. W międzyczasie zawsze jestboost::shared_array
.