Namespaces
Variants

std::experimental::ranges:: search_n

From cppreference.net
template < ForwardIterator I, Sentinel < I > S, class T,

class Pred = ranges:: equal_to <> , class Proj = ranges:: identity >
requires IndirectlyComparable < I, const T * , Pred, Proj >
I search_n ( I first, S last, ranges :: difference_type_t < I > count,

const T & value, Pred pred = Pred { } , Proj proj = Proj { } ) ;
(1) (ranges TS)
template < ForwardRange R, class T, class Pred = ranges:: equal_to <> ,

class Proj = ranges:: identity >
requires IndirectlyComparable < ranges:: iterator_t < R > , const T * , Pred, Proj >
ranges:: safe_iterator_t < R > search_n ( R && r,
ranges :: difference_type_t < ranges:: iterator_t < R >> count,

const T & value, Pred pred = Pred { } , Proj proj = Proj { } ) ;
(2) (ranges TS)
1) Durchsucht den Bereich [ first , last ) nach der ersten Sequenz von count Elementen, deren projizierte Werte jeweils gemäß dem Prädikat pred gleich dem gegebenen Wert value sind.
2) Gleich wie (1) , verwendet jedoch r als Quellbereich, als ob ranges:: begin ( r ) als first und ranges:: end ( r ) als last verwendet würde.

Inhaltsverzeichnis

Parameter

first, last - der Bereich der zu untersuchenden Elemente
r - der Bereich der zu untersuchenden Elemente
count - die Länge der zu suchenden Sequenz
value - der zu suchende Wert
pred - das Prädikat, das die projizierten Elemente mit value vergleicht
proj - die auf die Elemente anzuwendende Projektion

Rückgabewert

Iterator zum Anfang der gefundenen Sequenz im Bereich [ first , last ) . Falls keine solche Sequenz gefunden wird, wird ein Iterator zurückgegeben, der gleich last ist.

Komplexität

Höchstens last - first Anwendungen des Prädikats und der Projektion.

Mögliche Implementierung

template<ForwardIterator I, Sentinel<I> S, class T,
         class Pred = ranges::equal_to<>, class Proj = ranges::identity>
    requires IndirectlyComparable<I, const T*, Pred, Proj>
I search_n(I first, S last, ranges::difference_type_t<I> count,
           const T& value, Pred pred = Pred{}, Proj proj = Proj{})
{
    for (; first != last; ++first)
    {
        if (!ranges::invoke(pred, ranges::invoke(proj, *first), value))
            continue;
        I candidate = first;
        ranges::difference_type_t<I> cur_count = 0;
        while (true)
        {
            ++cur_count;
            if (cur_count == count)
                // Erfolg
                return candidate;
            ++first;
            if (first == last)
                // Liste erschöpft
                return first;
            if (!ranges::invoke(pred, ranges::invoke(proj, *first), value))
                // Zu wenige in Folge
                break;
        }
    }
    return first;
}

Beispiel

Siehe auch

sucht nach dem ersten Vorkommen einer Anzahl aufeinanderfolgender Kopien eines Elements in einem Bereich
(Funktions-Template)
findet die letzte Sequenz von Elementen in einem bestimmten Bereich
(Funktions-Template)
findet das erste Element, das bestimmte Kriterien erfüllt
(Funktions-Template)
sucht nach einem Bereich von Elementen
(Funktions-Template)