„size_t” vs „container :: size_type”


108

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:


108

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.


2
Czy możesz wyjaśnić tę odpowiedź? Spojrzałem na projekt standardów już wcześniej N1804i nie widzę żadnego związku między Allocator::size_typei size_type. Szybki rzut oka na libstdc ++ również nie pokazuje niczego podobnego.
Shafik Yaghmour

1
@ShafikYaghmour, Więc ta odpowiedź jest nieco przestarzała, ale myślę, że aby zmaksymalizować przenośność, rada jest nadal rozsądna: C ++ 03 określił „Tabela 32: size_type: typ, który może reprezentować rozmiar największego obiektu w modelu alokacji”. W tamtym 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.
Evan Teran

2
CARE odpowiedź jest nieprawidłowa .... zobacz stackoverflow.com/questions/4849678/… TL: DR: alokatory typ_rozmiaru muszą mieć wartość size_t, aw C ++ 17 typ_rozmiaru będą przestarzałe.
user3063349

1
@ user3063349 Nie widzę nic na tej stronie ani w standardzie C ++ 2017 (23.10.8), co mogłoby wskazać na size_typewycofanie. Co daje?
Marc 2377

42
  • 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 , przekonasz się, że size_typekontenery z Qt są zależne od wersji. W Qt3 było, unsigned intaw Qt4 zostało zmienione na int.


1
Uważam, że to trochę dziwne, gdy rozmiar czegoś jest wyrażony jako int. Czy moglibyśmy kiedykolwiek mieć ujemny rozmiar pojemnika?
Mihai Todor

10
@MihaiTodor: nie jest niczym niezwykłym, że ludzie używają podpisanych typów do wszystkiego, myślę, że Qt idzie w ich ślady. Powodem jest to, że operacje mieszane (w szczególności porównania) są tak katastrofalnym obszarem, że wiele osób wolałoby raczej unikać używania typów bez znaku dla numerów, niż zajmować się i / lub unikać mieszanych operacji. Tylko dlatego, że niepodpisane typy nie mogą wyrażać liczb ujemnych, nie oznacza, że muszą wykorzystać je do liczb, które nie mogą być ujemne :-) Przyznaję, jestem zaskoczony, że to intraczej nie ssize_t, intjest trochę mała.
Steve Jessop

2
„Wszystkie kontenery standardowe używają size_t jako parametru size_type” bardzo, bardzo fałszywe i wprowadzające w błąd. Tak, ZAZWYCZAJ to robią (przynajmniej wszystkie moje kompilatory tak robiły), ale odwołanie do języka C ++ nie stwierdza, że ​​musi być podobny dla wszystkich kontenerów STL !! więc ostrożnie
user3063349


8

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.