Namensräume
Varianten
Aktionen

std::experimental::ranges::count, std::experimental::ranges::count_if

Von cppreference.com
< cpp‎ | experimental‎ | ranges
 
 
 
 
 
template< InputIterator I, Sentinel<I> S, class T, class Proj = ranges::identity >

    requires IndirectRelation<ranges::equal_to<>, projected<I, Proj>, const T*>

ranges::difference_type_t<I> count( I first, S last, const T& value, Proj proj = Proj{} );
(1) (Ranges TS)
template< InputRange R, class T, class Proj = ranges::identity >

    requires IndirectRelation<ranges::equal_to<>,
                              projected<ranges::iterator_t<R>, Proj>, const T*>
ranges::difference_type_t<ranges::iterator_t<R>>

    count( R&& r, const T& value, Proj proj = Proj{} );
(2) (Ranges TS)
template< InputIterator I, Sentinel<I> S, class Proj = ranges::identity,

          IndirectUnaryPredicate<projected<I, Proj>> Pred >

ranges::difference_type_t<I> count_if( I first, S last, Pred pred, Proj proj = Proj{} );
(3) (Ranges TS)
template< InputRange R, class Proj = ranges::identity,

          IndirectUnaryPredicate<projected<ranges::iterator_t<R>, Proj>> Pred >
ranges::difference_type_t<ranges::iterator_t<R>>

    count_if( R&& r, Pred pred, Proj proj = Proj{} );
(4) (Ranges TS)

Gibt die Anzahl der Elemente im Bereich [firstlast) zurück, die bestimmte Kriterien erfüllen.

1) Zählt die Elemente, deren projizierte Werte gleich value sind (d.h. ranges::invoke(proj, *i) == value).
3) Zählt die Elemente, deren projizierte Werte das Prädikat pred erfüllen (d.h. ranges::invoke(pred, ranges::invoke(proj, *i)) != false).
2,4) Entspricht (1,3), verwendet aber r als Quellbereich, so als ob ranges::begin(r) als first und ranges::end(r) als last verwendet würden.

Ungeachtet der oben gezeigten Deklarationen ist die tatsächliche Anzahl und Reihenfolge der Template-Parameter für Algorithmusdeklarationen nicht spezifiziert. Wenn also explizite Template-Argumente beim Aufruf eines Algorithmus verwendet werden, ist das Programm wahrscheinlich nicht portabel.

Inhalt

[edit] Parameter

first, last - der Bereich der zu untersuchenden Elemente
r - der Bereich der zu untersuchenden Elemente
value - Der zu suchende Wert
pred - Prädikat, das auf die projizierten Elemente angewendet wird
proj - Projektion, die auf die Elemente angewendet wird

[edit] Rückgabewert

Anzahl der Elemente, die die Bedingung erfüllen.

[edit] Komplexität

Genau last - first Vergleiche / Anwendungen des Prädikats, und dieselbe Anzahl von Anwendungen der Projektion.

[edit] Hinweise

Für die Anzahl der Elemente im Bereich [firstlast) ohne zusätzliche Kriterien siehe ranges::distance.

[edit] Mögliche Implementierung

Erste Version
template<InputIterator I, Sentinel<I> S, class T, class Proj = ranges::identity>
    requires IndirectRelation<ranges::equal_to<>, projected<I, Proj>, const T*>
ranges::difference_type_t<I> count(I first, S last, const T& value, Proj proj = Proj{})
{
    ranges::difference_type_t<I> ret = 0;
    for (; first != last; ++first)
        if (ranges::invoke(proj, *first) == value)
            ++ret;
    return ret;
}
Zweite Version
template<InputIterator I, Sentinel<I> S, class Proj = ranges::identity,
         IndirectUnaryPredicate<projected<I, Proj>> Pred>
ranges::difference_type_t<I> count_if(I first, S last, Pred pred, Proj proj = Proj{})
{
    ranges::difference_type_t<I> ret = 0;
    for (; first != last; ++first)
        if (ranges::invoke(pred, ranges::invoke(proj, *i)))
            ++ret;
    return ret;
}

[edit] Beispiel

[edit] Siehe auch

Gibt die Anzahl der Elemente zurück, die bestimmte Kriterien erfüllen
(Funktionstempelat) [edit]
gibt die Distanz zwischen einem Iterator und einem Sentinel zurück, oder zwischen dem Anfang und dem Ende eines Bereichs
(Funktionsvorlage) [bearbeiten]