Gibt es einen Unterschied zwischen size_t
und container::size_type
?
Was ich verstehe, ist size_t
allgemeiner und kann für jedes size_type
s verwendet werden.
Aber ist container::size_type
für bestimmte Arten von Containern optimiert?
Gibt es einen Unterschied zwischen size_t
und container::size_type
?
Was ich verstehe, ist size_t
allgemeiner und kann für jedes size_type
s verwendet werden.
Aber ist container::size_type
für bestimmte Arten von Containern optimiert?
Antworten:
Die Standardcontainer definieren size_type
als typedef to Allocator::size_type
(Allocator ist ein Vorlagenparameter), für std::allocator<T>::size_type
das 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_type
also für maximale Allgemeinheit vorzuziehen.
size_t
war 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>::type
Standardmäßig. Was in der Praxis wahrscheinlich gleich oder kompatibel sein wird size_t
.
size_type
. Was gibt?
size_t
ist definiert als der Typ, der für die Größe eines Objekts verwendet wird, und ist plattformabhängig .container::size_type
ist der Typ, der für die Anzahl der Elemente im Container verwendet wird und containerabhängig ist .Alle std
Container werden size_t
als 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 qtSie werden feststellen, dass der size_type
von Qt-Containern versionabhängig ist. In Qt3 war es unsigned int
und in Qt4 wurde es geändert int
.
int
nicht ssize_t
, int
ist ziemlich klein.
Für std::[w]string
, std::[w]string::size_type
gleich 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_t
fü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_type
typedef verwenden, wenn Sie die Containergröße speichern müssen.
N1804
und sehe keine Beziehung zwischenAllocator::size_type
undsize_type
. Ein kurzer Blick auf libstdc ++ zeigt auch nichts Ähnliches.