'size_t' vs 'container :: size_type'


108

Gibt es einen Unterschied zwischen size_tund container::size_type?

Was ich verstehe, ist size_tallgemeiner und kann für jedes size_types verwendet werden.

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

Antworten:


108

Die Standardcontainer definieren size_typeals typedef to Allocator::size_type(Allocator ist ein Vorlagenparameter), für std::allocator<T>::size_typedas normalerweise definiert wirdsize_t (oder ein kompatibler Typ). Für den Standardfall sind sie also gleich.

Wenn Sie jedoch einen benutzerdefinierten Allokator verwenden, kann ein anderer zugrunde liegender Typ verwendet werden. Ist container::size_typealso für maximale Allgemeinheit vorzuziehen.


2
Können Sie diese Antwort klarstellen? Ich habe bereits auf den Entwurf von Standards zurückgeblickt N1804und sehe keine Beziehung zwischen Allocator::size_typeund size_type. Ein kurzer Blick auf libstdc ++ zeigt auch nichts Ähnliches.
Shafik Yaghmour

1
@ShafikYaghmour, Diese Antwort ist also etwas veraltet, aber um die Portabilität zu maximieren, denke ich, dass der Rat immer noch richtig ist: C ++ 03 angegeben "Tabelle 32: size_type: Ein Typ, der die Größe des größten Objekts im Zuordnungsmodell darstellen kann." Zu der Zeit size_twar die Wette praktische Umsetzung dieser Einschränkungen. In C ++ 11 ist es jetzt jedoch im Wesentlichen wie folgt definiert: std::make_unsigned<X::difference_type>::typeStandardmäßig. Was in der Praxis wahrscheinlich gleich oder kompatibel sein wird size_t.
Evan Teran

2
CARE die Antwort ist falsch .... siehe stackoverflow.com/questions/4849678/… TL: DR: Allokatoren size_type müssen size_t sein und in C ++ 17 wird size_type so wie es ist veraltet.
user3063349

1
@ user3063349 Ich sehe weder auf dieser Seite noch im C ++ 2017 Standard (23.10.8) Hinweise auf eine Ablehnung size_type. Was gibt?
März 2377

42
  • size_tist definiert als der Typ, der für die Größe eines Objekts verwendet wird, und ist plattformabhängig .
  • container::size_typeist der Typ, der für die Anzahl der Elemente im Container verwendet wird und containerabhängig ist .

Alle stdContainer werden size_tals verwendet size_type, aber jeder unabhängige Bibliotheksanbieter wählt einen Typ aus, den er für seinen Container als geeignet erachtet.

Wenn du siehst Sie werden feststellen, dass der size_typevon Qt-Containern versionabhängig ist. In Qt3 war es unsigned intund in Qt4 wurde es geändert int.


1
Ich finde es etwas seltsam, die Größe von etwas als int auszudrücken. Könnten wir jemals eine negative Größe für einen Container haben?
Mihai Todor

10
@MihaiTodor: Es ist nicht ungewöhnlich, dass Leute für alles signierte Typen verwenden. Ich denke, Qt folgt diesem Beispiel. Der Grund dafür ist, dass gemischte Operationen (insbesondere Vergleiche) ein derartiges Katastrophengebiet sind, dass viele Menschen lieber vermeiden würden, vorzeichenlose Typen für Zahlen zu verwenden, als sich mit gemischten Operationen befassen und / oder diese vermeiden zu müssen. Nur weil unsigned Typen keine negativen Zahlen ausdrücken kann, bedeutet nicht , Sie haben sie für Zahlen verwenden , die nicht negativ sein kann :-) Ich bekenne , ich bin überrascht es intnicht ssize_t, intist ziemlich klein.
Steve Jessop

2
"Alle Standardcontainer verwenden size_t als size_type" sehr, sehr falsch und irreführend. Ja, das tun sie normalerweise (zumindest alle meine Compiler haben das so gemacht), aber die C ++ - Sprachreferenz besagt nicht, dass sie für alle STL-Container ähnlich sein muss !! so care
user3063349


8

Für std::[w]string, std::[w]string::size_typegleich ist std::allocator<T>::size_type, die die gleiche ist std::size_t. Für andere Container ist es eine Implementierung, die einen vorzeichenlosen Ganzzahltyp definiert.

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

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.