Namensräume
Varianten
Aktionen

std::experimental::ranges::lexicographical_compare

Von cppreference.com
< cpp‎ | experimental‎ | ranges
 
 
 
 
 
template< InputIterator I1, Sentinel<I1> S1, InputIterator I2, Sentinel<I2> S2,

          class Proj1 = ranges::identity, class Proj2 = ranges::identity,
          class Comp = ranges::less<> >
    requires IndirectStrictWeakOrder<Comp, projected<I1, Proj1>, projected<I2, Proj2>>
bool lexicographical_compare( I1 first1, S1 last1, I2 first2, S2 last2,
                              Comp comp = Comp{},

                              Proj1 proj1 = Proj1{}, Proj2 proj2 = Proj2{} );
(1) (Ranges TS)
template< InputRange R1, InputRange R2,

          class Proj1 = ranges::identity, class Proj2 = ranges::identity,
          class Comp = ranges::less<> >
    requires IndirectStrictWeakOrder<Comp, projected<ranges::iterator_t<R1>, Proj1>,
                                           projected<ranges::iterator_t<R2>, Proj2>>
bool lexicographical_compare( R1&& r1, R2&& r2, Comp comp = Comp{},

                              Proj1 proj1 = Proj1{}, Proj2 proj2 = Proj2{} );
(2) (Ranges TS)
1) Prüft, ob der erste Bereich [first1last1) lexikographisch *kleiner* als der zweite Bereich [first2last2) ist. Elemente werden unter Verwendung der gegebenen binären Vergleichsfunktion comp verglichen, nachdem sie mit proj1 bzw. proj2 projiziert wurden.
2) Ähnlich 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ürden.

Lexikographischer Vergleich ist eine Operation mit den folgenden Eigenschaften:

  • Zwei Bereiche werden elementweise verglichen.
  • Das erste Element, das abweicht, bestimmt, welcher Bereich lexikographisch kleiner oder größer ist als der andere.
  • Wenn ein Bereich ein Präfix eines anderen ist, ist der kürzere Bereich lexikographisch kleiner als der andere.
  • Wenn zwei Bereiche äquivalente Elemente haben und die gleiche Länge haben, sind die Bereiche lexikographisch gleich.
  • Ein leerer Bereich ist lexikographisch kleiner als jeder nicht-leere Bereich.
  • Zwei leere Bereiche sind lexikographisch gleich.

Inhalt

[edit] Parameter

first1, last1 - der erste Bereich der zu untersuchenden Elemente
r1 - der erste Bereich der zu untersuchenden Elemente
first2, last2 - der zweite Bereich der zu untersuchenden Elemente
r2 - der zweite Bereich der zu untersuchenden Elemente
comp - Vergleichsfunktion, die 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

[edit] Rückgabewert

true, wenn der erste Bereich lexikographisch *kleiner* als der zweite ist.

[edit] Komplexität

Höchstens 2·min(N1, N2) Anwendungen der Vergleichsoperation, wobei N1 = last1 - first1 und N2 = last2 - first2.

[edit] Mögliche Implementierung

template<InputIterator I1, Sentinel<I1> S1, InputIterator I2, Sentinel<I2> S2,
         class Proj1 = ranges::identity, class Proj2 = ranges::identity,
         class Comp = ranges::less<>>
    requires IndirectStrictWeakOrder<Comp, projected<I1, Proj1>, projected<I2, Proj2>>
bool lexicographical_compare(I1 first1, S1 last1, I2 first2, S2 last2,
                             Comp comp = Comp{}, 
                             Proj1 proj1 = Proj1{}, Proj2 proj2 = Proj2{})
{
    for (; (first1 != last1) && (first2 != last2); (void) ++first1, (void) ++first2)
    {
        if (ranges::invoke(comp, ranges::invoke(proj1, *first1),
                                 ranges::invoke(proj2, *first2)))
            return true;
        if (ranges::invoke(comp, ranges::invoke(proj2, *first2),
                                 ranges::invoke(proj1, *first1)))
            return false;
    }
    return (first1 == last1) && (first2 != last2);
}

[edit] Beispiel

[edit] Siehe auch

gibt true zurück, wenn ein Bereich lexikographisch kleiner als ein anderer ist
(Funktionsvorlage) [editieren]
Bestimmt, ob zwei Elementmengen gleich sind
(Funktionsvorlage) [bearbeiten]