Wann sollte ich vectorint :: size_type anstelle von size_t verwenden?

7

In diese Frage sehe ich Folgendes:

%Vor%

Ich verstehe, warum int hier nicht verwendet wird, aber warum nicht einfach size_t verwenden?

Unter welchen Umständen sollte ich vector<int>::size_type anstelle von size_t verwenden?

    
Deqing 23.06.2013, 05:52
quelle

4 Antworten

16

Die primäre Zeit für die Verwendung von size_type liegt in einer Vorlage. Obwohl std::vector<T>::size_type normalerweise size_t ist, könnte some_other_container<T>::size_type stattdessen ein anderer Typ sein 1 . Eines der wenigen Dinge, die ein Benutzer dem Namespace std hinzufügen darf, ist eine Spezialisierung einer vorhandenen Vorlage für einen benutzerdefinierten Typ. Daher kann std::vector<T>::size_type für einige oddball T könnte tatsächlich ein anderer Typ als size_t sein, obwohl die in der Standardbibliothek definierte Basisvorlage wahrscheinlich immer size_t verwendet.

Wenn Sie also den richtigen Typ für einen bestimmten Container in einer Vorlage verwenden möchten, die mit diesem Container arbeitet, möchten Sie container::size_type verwenden und nicht nur size_t .

Beachten Sie jedoch, dass generischer Code selten direkt mit einem Container arbeiten sollte. Stattdessen sollte es normalerweise mit Iteratoren arbeiten, statt container<T>::size_type würde es stattdessen etwas wie std::iterator_traits<WhateverIterator>::difference_type verwenden.

  1. Und für einige spezifische T könnte auch vector<T>::size_type ein anderer Typ sein - eines der wenigen Dinge, die Sie in den Namensraum std einfügen können, ist eine Spezialisierung einer vorhandenen Klasse für einen Benutzer -definierter Typ, für einige T , vector<T> könnte also ein ganz anderer Container verwendet werden als für die meisten anderen Typen. Dies ist typisch für vector<bool> , aber auch für andere Typen möglich.
Jerry Coffin 23.06.2013, 06:03
quelle
5

Ein Grund, es zu benutzen, ist Konsistenz. Es stimmt zwar, dass size_t ausreicht, um ein std::vector zu indizieren / zählen, es reicht jedoch konzeptionell nicht aus, um ein std::list oder irgendeinen anderen nicht-arraybasierten Container zu indizieren / zählen. Wenn Sie mit Containern arbeiten, sollten Sie normalerweise container_type::size_type verwenden.

Wenn Sie im generischen Code den tatsächlichen Typ des Containers nicht kennen, haben Sie keine andere Wahl, als container_type::size_type zu verwenden. Und selbst wenn in einem bestimmten Code bekannt ist, dass der Container ein std::vector ist, müssen Sie keine Ausnahme machen und plötzlich zu size_t wechseln.

    
AnT 23.06.2013 06:02
quelle
1

Von: vector & lt; int & gt; :: size_type in C ++

" size_type ist ein (statischer) Mitgliedstyp vom Typ vector<int> . Normalerweise ist es ein typedef für std::size_t , was normalerweise ein typedef für unsigned int oder unsigned long long ist."

    
fatihk 23.06.2013 06:01
quelle
-1

Ich denke, sie sind gleich.

%Vor%     
BlackMamba 23.06.2013 10:28
quelle

Tags und Links