2009-05-27 16 views
83

Czy istnieje różnica między size_t a container::size_type?"size_t" kontra "container :: size_type"

To, co rozumiem, to size_t, jest bardziej ogólne i może być używane dla dowolnych modeli size_type.

Ale czy container::size_type jest zoptymalizowany pod kątem określonych rodzajów pojemników?

Odpowiedz

88

standardowe pojemniki określić size_type jako typedef do Allocator::size_type (przydzielania jest parametrem matrycy), który dla std::allocator<T>::size_type jest zwykle określa się size_t (lub typu zgodnego). Więc w przypadku standardowym są takie same.

Jeśli jednak używasz niestandardowego przydziału, można użyć innego bazowego typu. Tak więc container::size_type jest preferowany dla maksymalnej ogólności.

+2

Czy możesz wyjaśnić tę odpowiedź? Spojrzałem wstecz na projekty standardów już w "N1804" i nie widzę żadnego związku między 'Allocator :: size_type' i' size_type'. Szybkie spojrzenie na libstdC++ również nie pokazuje niczego podobnego. –

+1

@ShafikYaghmour, więc ta odpowiedź jest nieco nieaktualna, ale aby zmaksymalizować przenośność, myślę, że rada jest nadal dobra: C++ 03 określono "Tabela 32: size_type: typ, który może reprezentować rozmiar największego obiektu w modelu alokacji. " W tamtym czasie 'size_t' było założeniem praktycznej implementacji tych ograniczeń. Jednak w C++ 11 jest teraz zdefiniowany zasadniczo jako: 'std :: make_unsigned :: type' domyślnie. Który w praktyce będzie prawdopodobnie taki sam lub zgodny z 'size_t'. –

+1

CARE odpowiedź jest niepoprawna .... patrz http: // stackoverflow.com/questions/4849678/c-for-loop-size-type-vs-size-t TL: DR: podzielniki typu size_type muszą być size_t aw C++ 17 size_type zostaną uznane za przestarzałe. – user3063349

8

Dla std::[w]string, jest równa std::allocator<T>::size_type, która jest równa std::size_t. W przypadku innych kontenerów jest to pewna implementacja zdefiniowanego typu całkowitego typu unsigned.

Czasami dobrze jest mieć dokładny typ, więc na przykład wiadomo, gdzie typ otacza się na (np. Do UINT_MAX), aby można było z niego skorzystać. Lub w przypadku szablonów, w których naprawdę trzeba przekazać dwa identyczne typy do szablonów funkcji/klasy.

Często używam size_t dla zwięzłości i iteratorów. W ogólnym kodzie, ponieważ generalnie nie wiadomo, z jakiego kontenera wystąpił twój szablon i jaki jest rozmiar tych kontenerów, będziesz musiał użyć Container::size_type typedef, jeśli chcesz przechowywać rozmiar kontenera.

32
  • size_t definiuje się jako typ stosowanego do wielkości obiektu i platforma zależne.
  • container::size_type jest typem używanym do liczby elementów w kontenerze i jest zależny od kontenera .

Wszystko std pojemniki używać size_t jako size_type, ale każdy niezależny sprzedawca biblioteki wybiera typ, który uzna za odpowiedni dla jego kontenera.

Jeśli spojrzeć na , okaże się, że size_type pojemników Qt zależy od wersji. W Qt3 było to unsigned int, aw Qt4 zmieniono je na int.

+1

Uważam, że to trochę dziwne, mieć rozmiar czegoś wyrażonego jako int. Czy kiedykolwiek moglibyśmy mieć ujemny rozmiar pojemnika? –

+8

@MihaiTodor: nie jest niczym niezwykłym, aby ludzie używali podpisanych typów do wszystkiego, myślę, że Qt jest następcą. Powodem jest to, że operacje mieszane (w szczególności porównania) są takim obszarem katastrofy, że wiele osób wolałoby unikać używania liczb niepodpisanych dla liczb, niż radzić sobie i/lub unikać mieszanych operacji. Tylko dlatego, że typy bez znaku nie mogą wyrażać liczb ujemnych, nie oznacza, że ​​* musisz * używać ich dla liczb, które nie mogą być ujemne :-) Przyznaję, że jestem zaskoczony, że jest to 'int', a nie' ssize_t', ' int' jest trochę mały. –

+0

@Steve Tak, masz rację. Dzięki. –