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?
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:
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.
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.
size_type. Was gibt?
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 qtSie werden feststellen, dass der size_typevon Qt-Containern versionabhängig ist. In Qt3 war es unsigned intund in Qt4 wurde es geändert int.
intnicht ssize_t, intist ziemlich klein.
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.
N1804und sehe keine Beziehung zwischenAllocator::size_typeundsize_type. Ein kurzer Blick auf libstdc ++ zeigt auch nichts Ähnliches.