2009-05-27 19 views
83

Gibt es einen Unterschied zwischen size_t und container::size_type?'size_t' vs 'container :: size_type'

Was ich verstehe, ist size_t ist generischer und kann für alle size_type s verwendet werden.

Aber ist container::size_type für bestimmte Arten von Containern optimiert?

Antwort

88

Die Standardcontainer definieren size_type als typedef zu Allocator::size_type (Zuweiser ist eine Template-Parameter), die für std::allocator<T>::size_type ist typischerweise definiert size_t (oder einem kompatiblen Typ) zu sein. Für den Standardfall sind sie also gleich.

Wenn Sie jedoch einen benutzerdefinierten Zuordner verwenden, könnte ein anderer zugrunde liegender Typ verwendet werden. So ist container::size_type für maximale Allgemeinheit vorzuziehen.

+2

Können Sie diese Antwort klären? Ich habe auf den Entwurf der Standards zurück bis 'N1804' geschaut und ich sehe keine Beziehung zwischen' Allocator :: size_type' und 'size_type'. Ein kurzer Blick auf libstdC++ zeigt auch nichts Ähnliches. –

+1

@ShafikYaghmour, Also diese Antwort ist etwas veraltet, aber um die Portabilität zu maximieren, denke ich, der Rat ist immer noch solide: C++ 03 angegeben "Tabelle 32: size_type: ein Typ, der die Größe des größten Objekts im Zuordnungsmodell darstellen kann. " Zu der Zeit war 'size_t' die Wette praktische Umsetzung dieser Einschränkungen. In C++ 11 wird es jetzt jedoch im Wesentlichen wie folgt definiert: "std :: make_unsigned :: type". Was in der Praxis wahrscheinlich gleich oder kompatibel mit 'size_t' sein wird. –

+1

CARE die Antwort ist falsch .... siehe http: // stackoverflow.com/questions/4849678/c-for-Schleife-Größe-Typ-vs-Größe-t TL: DR: Zuweiser size_type muss size_t sein und in C++ 17 size_type wird veraltet wie es ist. – user3063349

8

Für std::[w]string ist std::[w]string::size_type gleich std::allocator<T>::size_type, was gleich std::size_t ist. Bei anderen Containern ist eine Implementierung als vorzeichenloser Integer-Typ definiert.

Manchmal ist es nützlich, den genauen Typ zu haben, also weiß man zum Beispiel, wo der Typ sich umschlingt (wie zum Beispiel UINT_MAX), damit man davon Gebrauch machen kann. Oder für Vorlagen, wo Sie wirklich zwei identische Typen an Funktions-/Klassenvorlagen übergeben müssen.

Oft finde ich size_t für die Kürze oder Iteratoren sowieso. Da Sie im allgemeinen Code nicht wissen, mit welcher Containerinstanz Ihre Vorlage verwendet wird und welche Größe diese Container haben, müssen Sie Container::size_type typedef verwenden, wenn Sie die Containergröße speichern müssen.

32
  • size_t wird als der für die Größe eines Objekts verwendeten Typen definiert und ist plattformabhängige.
  • container::size_type ist der Typ, der für die Anzahl der Elemente im Container verwendet wird und containerabhängig ist.

Alle std Behälter verwenden size_t als size_type, aber jede unabhängige Anbieter Bibliothek wählt einen Typ, der es für seine entsprechende Container findet.

Wenn Sie sich ansehen, werden Sie feststellen, dass die size_type der Qt-Container versionsabhängig ist. In Qt3 war es unsigned int und in Qt4 wurde es zu int geändert.

+1

Ich finde es ein bisschen komisch, die Größe von etwas als int auszudrücken. Könnten wir jemals eine negative Größe für einen Container haben? –

+8

@MihaiTodor: Es ist nicht ungewöhnlich für Leute, signierte Typen für alles zu verwenden, ich denke, Qt folgt dem Beispiel. Der Grund dafür ist, dass gemischte Operationen (insbesondere Vergleiche) ein solches Katastrophengebiet darstellen, dass viele Menschen eher vermeiden möchten, vorzeichenlose Typen für Zahlen zu verwenden, als sich mit gemischten Operationen auseinanderzusetzen und/oder zu vermeiden. Nur weil unsignierte Typen keine negativen Zahlen ausdrücken können, bedeutet das nicht, dass Sie sie für Zahlen verwenden müssen, die nicht negativ sein können :-) Ich gebe zu, ich bin überrascht, dass es "int" ist und nicht "ssize_t" int 'ist irgendwie klein. –

+0

@Steve Ja, Sie haben einen Punkt. Vielen Dank. –