Czy jest różnica między size_ti container::size_type?
Rozumiem, że size_tjest bardziej ogólny i może być używany do dowolnych celów size_type.
Ale czy jest container::size_typezoptymalizowany pod kątem określonych rodzajów pojemników?
Czy jest różnica między size_ti container::size_type?
Rozumiem, że size_tjest bardziej ogólny i może być używany do dowolnych celów size_type.
Ale czy jest container::size_typezoptymalizowany pod kątem określonych rodzajów pojemników?
Odpowiedzi:
Standardowe pojemniki określić size_typejako typedef do Allocator::size_type(przydzielania jest parametrem matrycy), która przez std::allocator<T>::size_typeto 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_typejest preferowane dla maksymalnej ogólności.
size_tczasie zakład był praktyczną implementacją tych ograniczeń. Jednak w C ++ 11 jest teraz zasadniczo zdefiniowany jako: std::make_unsigned<X::difference_type>::typedomyślnie. Który w praktyce prawdopodobnie będzie taki sam lub zgodny z size_t.
size_typewycofanie. Co daje?
size_tjest definiowany jako typ używany do wielkości obiektu i zależy od platformy .container::size_typejest typem używanym dla liczby elementów w kontenerze i zależy od kontenera .Wszystkie stdkontenery są używane size_tjako 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_typekontenery z Qt są zależne od wersji. W Qt3 było, unsigned intaw Qt4 zostało zmienione na int.
intraczej nie ssize_t, intjest trochę mała.
Na std::[w]string, std::[w]string::size_typejest 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_tdla 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_typeczcionki typedef, jeśli chcesz zapisać rozmiar kontenera.
N1804i nie widzę żadnego związku międzyAllocator::size_typeisize_type. Szybki rzut oka na libstdc ++ również nie pokazuje niczego podobnego.