Namespaces
Variants

std::experimental::ranges:: search

From cppreference.net
template < ForwardIterator I1, Sentinel < I1 > S1,

ForwardIterator I2, Sentinel < I2 > S2, class Pred = ranges:: equal_to <> ,
class Proj1 = ranges:: identity , class Proj2 = ranges:: identity >
requires IndirectlyComparable < I1, I2, Pred, Proj1, Proj2 >
I1 search ( I1 first1, S1 last1, I2 first2, S2 last2,

Pred pred = Pred { } , Proj1 proj1 = Proj1 { } , Proj2 proj2 = Proj2 { } ) ;
(1) (ranges TS)
template < ForwardRange R1, ForwardRange R2, class Pred = ranges:: equal_to <> ,

class Proj1 = ranges:: identity , class Proj2 = ranges:: identity >
requires IndirectlyComparable < ranges:: iterator_t < R1 > , ranges:: iterator_t < R2 > ,
Pred, Proj1, Proj2 >
ranges:: safe_iterator_t < R1 > search ( R1 && r1, R2 && r2, Pred pred = Pred { } ,

Proj1 proj1 = Proj1 { } , Proj2 proj2 = Proj2 { } ) ;
(2) (ranges TS)
1) Sucht nach dem ersten Vorkommen der Elementsequenz [ first2 , last2 ) im Bereich [ first1 , last1 ) . Elemente werden mit pred verglichen, nachdem sie mit proj2 bzw. proj1 projiziert wurden.
2) Gleich wie (1) , verwendet jedoch r1 als ersten Quellbereich und r2 als zweiten Quellbereich, als ob ranges:: begin ( r1 ) als first1 , ranges:: end ( r1 ) als last1 , ranges:: begin ( r2 ) als first2 , und ranges:: end ( r2 ) als last2 verwendet würde.

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

Inhaltsverzeichnis

Parameter

first1, last1 - der Bereich der zu untersuchenden Elemente
r1 - der Bereich der zu untersuchenden Elemente
first2, last2 - der Bereich der zu durchsuchenden Elemente
r2 - der Bereich der zu durchsuchenden Elemente
pred - Prädikat, das auf die projizierten Elemente angewendet wird
proj1 - Projektion, die auf die Elemente im ersten Bereich angewendet wird
proj2 - Projektion, die auf die Elemente im zweiten Bereich angewendet wird

Rückgabewert

Ein Iterator zum Anfang des ersten Vorkommens der Sequenz [ first2 , last2 ) im Bereich [ first1 , last1 ) . Wenn [ first2 , last2 ) leer ist, wird first1 zurückgegeben. Wenn kein solches Vorkommen gefunden wird, wird ein Iterator zurückgegeben, der gleich last1 ist.

Komplexität

Höchstens S * N Anwendungen des Prädikats und jeder Projektion, wobei S = last2 - first2 und N = last1 - first1 .

Mögliche Implementierung

template<ForwardIterator I1, Sentinel<I1> S1,
         ForwardIterator I2, Sentinel<I2> S2, class Pred = ranges::equal_to<>,
         class Proj1 = ranges::identity, class Proj2 = ranges::identity>
    requires IndirectlyComparable<I1, I2, Pred, Proj1, Proj2>
I1 search(I1 first1, S1 last1, I2 first2, S2 last2,
          Pred pred = Pred{}, Proj1 proj1 = Proj1{}, Proj2 proj2 = Proj2{})
{
    for (; ; ++first1)
    {
        I1 it = first1;
        for (I2 it2 = first2; ; (void)++it, (void)++it2)
        {
            if (it2 == last2)
                return first1;
            if (it == last1)
                return it;
            if (!ranges::invoke(pred, ranges::invoke(proj1, *it),
                                      ranges::invoke(proj2, *it2)))
                break;
        }
    }
}

Beispiel

Siehe auch

sucht nach dem ersten Vorkommen eines Elementbereichs
(Funktions-Template)
findet die letzte Sequenz von Elementen in einem bestimmten Bereich
(Funktions-Template)
gibt true zurück, falls eine Menge Teilmenge einer anderen ist
(Funktions-Template)
bestimmt, ob zwei Elementmengen identisch sind
(Funktions-Template)
findet das erste Element, das spezifische Kriterien erfüllt
(Funktions-Template)
gibt true zurück, falls ein Bereich lexikographisch kleiner als ein anderer ist
(Funktions-Template)
findet die erste Position, an der zwei Bereiche sich unterscheiden
(Funktions-Template)
sucht nach einer Anzahl aufeinanderfolgender Kopien eines Elements in einem Bereich
(Funktions-Template)