Czy jest różnica między size_t
i container::size_type
?
Rozumiem, że size_t
jest bardziej ogólny i może być używany do dowolnych celów size_type
.
Ale czy jest container::size_type
zoptymalizowany pod kątem określonych rodzajów pojemników?
Czy jest różnica między size_t
i container::size_type
?
Rozumiem, że size_t
jest bardziej ogólny i może być używany do dowolnych celów size_type
.
Ale czy jest container::size_type
zoptymalizowany pod kątem określonych rodzajów pojemników?
Odpowiedzi:
Standardowe pojemniki określić size_type
jako typedef do Allocator::size_type
(przydzielania jest parametrem matrycy), która przez std::allocator<T>::size_type
to zwykle określa się jakosize_t
(lub typu zgodnego). Więc w przypadku standardowym są takie same.
Jeśli jednak używasz niestandardowego alokatora, można użyć innego typu bazowego. Więc container::size_type
jest preferowane dla maksymalnej ogólności.
size_t
czasie zakład był praktyczną implementacją tych ograniczeń. Jednak w C ++ 11 jest teraz zasadniczo zdefiniowany jako: std::make_unsigned<X::difference_type>::type
domyślnie. Który w praktyce prawdopodobnie będzie taki sam lub zgodny z size_t
.
size_type
wycofanie. Co daje?
size_t
jest definiowany jako typ używany do wielkości obiektu i zależy od platformy .container::size_type
jest typem używanym dla liczby elementów w kontenerze i zależy od kontenera .Wszystkie std
kontenery są używane size_t
jako size_type
, ale każdy niezależny dostawca biblioteki wybiera typ, który uzna za odpowiedni dla swojego kontenera.
Jeśli spojrzysz na qt, przekonasz się, że size_type
kontenery z Qt są zależne od wersji. W Qt3 było, unsigned int
aw Qt4 zostało zmienione na int
.
int
raczej nie ssize_t
, int
jest trochę mała.
Na std::[w]string
, std::[w]string::size_type
jest równa std::allocator<T>::size_type
, co jest równestd::size_t
. W przypadku innych kontenerów jest to jakaś implementacja zdefiniowana jako liczba całkowita bez znaku.
Czasami przydatne jest posiadanie dokładnego typu, więc na przykład wiadomo, gdzie typ zawija się do (like, to UINT_MAX
), aby można było to wykorzystać. Lub w przypadku szablonów, w których naprawdę musisz przekazać dwa identyczne typy do szablonów funkcji / klas.
Często i tak używam size_t
dla zwięzłości lub iteratorów. W kodzie ogólnym, ponieważ generalnie nie wiesz, z jaką instancją kontenera jest używany Twój szablon i jaki rozmiar mają te kontenery, będziesz musiał użyć Container::size_type
czcionki typedef, jeśli chcesz zapisać rozmiar kontenera.
N1804
i nie widzę żadnego związku międzyAllocator::size_type
isize_type
. Szybki rzut oka na libstdc ++ również nie pokazuje niczego podobnego.