2013-02-11 6 views
5

Ich war wirklich überrascht zu sehen, dass std::count eine iterator_traits<InputIterator>::difference_type zurückgegeben, die wiederum bezieht sich auf eine long int auf meiner Plattform.Warum gibt std :: count eine vorzeichenbehaftete Ganzzahl zurück?

Warum ist das? Ein negatives Zählen von Elementen innerhalb eines Containers macht keinen Sinn.

+1

Der Unterschied ist nur negativ, wenn der Bereich ungültig ist, und dies führt zu einem undefinierten Verhalten während des Algorithmus. –

+0

Diese Diskussion kann hilfreich sein: http://stackoverflow.com/questions/7505083/why-does-the-c-standard-algorithm-count-return-a-ptrdiff-t-instead-of-size-t?answertab = aktiv # tab-top – Jordan

+0

@ChristianIvicevic, ich bin verwirrt. Ist es undefiniertes Verhalten oder nicht? Ich meine, entweder die Grenzen der Iteratoren werden überprüft und es wird ein negativer Wert bei einem Fehler zurückgegeben, oder es ist ein undefiniertes Verhalten und dann ist das, was es zurückgibt, undefiniert. – qdii

Antwort

5

Es ist eigentlich eine std::ptrdiff_t, die eine Ganzzahl mit Vorzeichen sein muss. Es muss signiert werden, da es als der Unterschied zwischen zwei Iteratoren verwendet werden kann, und das kann natürlich negativ sein.

+0

+1. Verdammt, ich hätte eine Antwort und keinen Kommentar erstellen sollen ... aber ja, das stimmt. –

+2

Also die nächste Frage ist, warum sie 'std :: ptrdiff_t' für std :: count verwenden, und es wird in einem anderen Beitrag beantwortet. so danke. – qdii

+1

@qdii 'std :: iterator_traits :: difference_type' ist das gleiche wie die Iteratoren' difference_type', die standardmäßig auf 'ptrdiff_t' (wie zB [hier] (http://en.cppreference.com/w/cpp/) Iterator/Iterator). Warum der Abstand als 'ptrdiff_t' angegeben wird, ist _probably_, da Iteratoren ähnlich wie Zeiger verwendet werden können, aber die (C++ 11) -Spezifikation gibt keinen Grund dafür, warum sie es nur angibt –