2015-03-10 5 views
6

Nur realisiert, dass std::count_ifreturns a signed value.Warum gibt std :: count_if einen vorzeichenbehafteten Wert anstelle von unsigned zurück?

Warum ist es so konzipiert? Es macht beide keinen Sinn (das Ergebnis kann nur eine natürliche Zahl sein, dh keine negative Ganzzahl), da es nicht erlaubt, etwas so Einfaches zu tun, wie dieses Ergebnis mit dem size() des Containers zu vergleichen, ohne entweder eine Warnung zu erhalten oder zu verwenden explizite Typkonvertierung

Ich glaube wirklich, dass der Rückgabetyp size_type haben sollte.

Fehle ich etwas?

+0

Es ist sinnvoll, den 'difference_type' des Iterators für' count' zurückzugeben, da es sich nur um den Unterschied der Argumente handelt, es sinnvoll ist, diese Schnittstelle für 'count_if' beizubehalten, und es macht auch einige Sinn für den "difference_type", der für bidirektionale Iteratoren zu signieren ist. – BoBTFish

+0

In ähnlicher Weise kann man nicht zwei 'std :: list's in einer konstanten Zeit teilen? –

+1

@WojciechFrohmberg: Einfach, Sie müssen die Elemente zählen. Die einmal erstellte Liste hat O (1) '.size()', was bedeutet, dass sie zwischengespeichert ist, – MSalters

Antwort

2

Ich denke, der Rückgabetyp soll kompatibel zu sein std::count, die zwei Iteratoren (denken Sie an Zeiger) und die Werte dazwischen (die Sie sich vorstellen können als Unterschied von zwei Zeigern). Eine Zeigerdifferenz (wie in ptrdiff_t verwendet) muss ein vorzeichenbehafteter Wert sein.

Dank der Kompatibilität zu std::count können Sie einfach die Ergebnisse dieser beiden Funktionen vergleichen.

Edit: Es gibt hier keinen bereichsbezogenen Nachteil mit einem vorzeichenbehafteten Wert, da der Wert mindestens im Bereich [0, std::count] liegt, der selbst im Bereich [0, end_ptr - start_ptr] liegt. Da end_ptr - start_ptr als ptrdiff_t oder ähnlich eingegeben wird, ist es signiert.

+3

Unsinn. Die 'std :: count' Beschreibung sagt eindeutig:" Gibt die ** Anzahl der Elemente ** im Bereich [first, last] zurück, die sich mit val vergleichen. " Die Anzahl der Elemente kann nicht negativ sein. Der Typ der "count" Argumente (Iteratoren) ist völlig unabhängig. –

+0

@VioletGiraffe: Ja. Die Anzahl der Elemente kann nicht negativ sein. Aber die Signaturen von "count" und "count_if" enthalten beide Iteratoren. Ich habe nicht gesagt, dass es viel Sinn macht, eine Reihe von unterschriebenen Elementen zu definieren ... – urzeit

Verwandte Themen