2012-09-24 6 views
12

Mögliche Duplizieren:
Why does the C++ standard algorithm “count” return a ptrdiff_t instead of size_t?Warum gibt std :: count (_if) iterator :: difference_type statt size_t zurück?

Es gibt Algorithmus std::count/std::count_if in Standard C++.

template<class InputIterator, class T> 
typename iterator_traits<InputIterator>::difference_type 
count(InputIterator first, InputIterator last, const T& value); 

template<class InputIterator, class Predicate> 
typename iterator_traits<InputIterator>::difference_type 
count_if(InputIterator first, InputIterator last, Predicate pred); 

Effekte: Gibt die Anzahl der Iteratoren i im Bereich von [ersten, für die letzte) folgende entsprechenden Bedingungen halten: * i == Wert, pred (* i) = false!.

difference_type ist iterator's difference_type, die negativ sein kann, aber count nur Wert> = 0. Warum difference_type und nicht size_t zum Beispiel zurückkehren können?

Antwort

12

In der Theorie haben Sie möglicherweise eine enorme Sequenz, deren Anzahl der Elemente nur mit 128 Bits dargestellt werden kann. Unter der Annahme, dass die Implementierung einen entsprechenden Integer-Typ unterstützt, ist es sehr wahrscheinlich, dass size_t einen 64-Bit-Typ verwendet. Der Iterator für diese große Sequenz könnte jedoch eine 128-Bit-Ganzzahl verwenden. Beachten Sie, dass die Sequenz nicht im Speicher eines einzelnen Computers dargestellt werden muss. Es kann auf mehrere große Datenbanken aufgeteilt sein.

Möglicherweise verfügen Sie auch über einen relativ kleinen Computer, der nur einen 32-Bit-Typ mit angemessener Leistung unterstützt. Für die vollständige Standardkonformität muss möglicherweise ein 64-Bit-Typ unterstützt werden, es kann jedoch wünschenswert sein, eher schnellere Berechnungen unter Verwendung einer nativ von der Plattform unterstützten Darstellung zu unterstützen. Das heißt, size_t ist möglicherweise nicht die optimale Wahl. Beim Erstellen von Iteratoren wissen Sie im Allgemeinen, welche Größe unterstützt werden muss.

+0

Danke, tolle Erklärung. – ForEveR

+1

@DietmarKuehl Aber warum ist 'iterator_traits :: difference_type' eine bessere Wahl? In den meisten Fällen handelt es sich um eine 8-Byte-Ganzzahl mit Vorzeichen, die das Argument, dass 'size_t' (8-Byte-Ganzzahl ohne Vorzeichen) möglicherweise nicht groß genug ist, bereits zerlegt. –

+2

@GrimFandango: Wie wirken sich die für andere Iteratoren getroffenen Entscheidungen auf meine Wahl von "EnhancedIterator :: difference_type" aus? Der Punkt ist, dass die Verwendung von 'std :: size_t' verhindern würde, dass spezielle Fälle spezielle Auswahlen verwenden, während die Verwendung des geschachtelten Typs es erlaubt, geeignete Auswahlen zu treffen. –