2016-06-10 9 views
3

Ich möchte die Zahl 0 in einem Vektor von vorzeichenlosen langen ganzen Zahlen zählen. Gibt es eine vorhandene Standardfunktion/Funktor, die an std::count_if übergeben werden kann? Oder soll ich es selbst so schreiben wie dieses Beispiel?Existierender Standard Funktor/Funktion um Gleichheit zu 0 zu prüfen?

class is_equal 
{ 
    private: 
    unsigned long int v; 
    public: 
    is_equal(unsigned long int value) : v(value) {} 
    bool operator() (unsigned long int x) { return x == this->v; } 
}; 

unsigned long int count_zero(const std::vector<unsigned long int>& data) 
{ 
    return std::count_if(data.begin(), data.end(), is_equal(0)); 
} 

Hinweis: ich nicht C++ verwenden 11 für Kompatibilitätsgründen.

+3

Sie können einfach ['std :: count'] (http://en.cppreference.com/w/cpp/algorithm/count) mit einem einzigen Wert verwenden. – BoBTFish

+0

Was ist mit 'std :: equal_to' mit' std :: bind2nd'? –

+0

Sie meinen wie ['std :: equal_to'] (http://en.cppreference.com/w/cpp/utility/functional/equal_to)? Aber es ist besser, einfach 'std :: count' zu verwenden, wie bereits vorgeschlagen. –

Antwort

7

std::count(data.begin(), data.end(), v); würde es tun. (Wenn der Vektor ist, sortiert, können Sie das Ergebnis in O (Log N) unter Verwendung von std::lower_bound und std::upper_bound erhalten).

Sie müssen nur sicherstellen, dass vgenau der gleiche Typ wie das Vektorelement ist - es sei denn, Sie sagen dem Compiler, welche Template Instanziierung Sie verwenden möchten.

+0

'equal_to' wäre im allgemeinen Fall besser, da es die Typen automatisch ableitet, aber in diesem Fall ist' count' besser. –

Verwandte Themen