Namensräume
Varianten
Aktionen

std::experimental::ranges::search

Von cppreference.com
< cpp‎ | experimental‎ | ranges
 
 
 
 
 
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 Sequenz von Elementen [first2last2) im Bereich [first1last1). Elemente werden mittels pred verglichen, nachdem sie mit proj2 bzw. proj1 projiziert wurden.
2) Wie (1), verwendet aber 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ü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

[bearbeiten] 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

[bearbeiten] Rückgabewert

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

[bearbeiten] Komplexität

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

[bearbeiten] 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;
        }
    }
}

[bearbeiten] Beispiel

[bearbeiten] Siehe auch

Sucht nach dem ersten Vorkommen eines Elementbereichs
(Funktionstempelat) [edit]
Findet die letzte Sequenz von Elementen in einem bestimmten Bereich
(Funktionsvorlage) [bearbeiten]
gibt true zurück, wenn eine Menge eine Teilmenge einer anderen ist
(Funktionsvorlage) [bearbeiten]
Bestimmt, ob zwei Elementmengen gleich sind
(Funktionsvorlage) [bearbeiten]
Findet das erste Element, das bestimmte Kriterien erfüllt
(Funktionsvorlage) [bearbeiten]
gibt true zurück, wenn ein Bereich lexikographisch kleiner als ein anderer ist
(Funktionsvorlage) [bearbeiten]
Findet die erste Position, an der sich zwei Bereiche unterscheiden
(Funktionsvorlage) [bearbeiten]
sucht nach einer Anzahl aufeinanderfolgender Kopien eines Elements in einem Bereich
(Funktionsvorlage) [bearbeiten]