Namensräume
Varianten
Aktionen

std::experimental::ranges::is_permutation

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>
bool is_permutation( 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>
bool is_permutation( R1&& r1, R2&& r2, Pred pred = Pred{},

                     Proj1 proj1 = Proj1{}, Proj2 proj2 = Proj2{} );
(2) (Ranges TS)
template< ForwardIterator I1, Sentinel<I1> S1, class I2,

          class Pred = ranges::equal_to<>,
          class Proj1 = ranges::identity, class Proj2 = ranges::identity >
    requires ForwardIterator<std::decay_t<I2>> && !Range<I2> &&
             IndirectlyComparable<I1, std::decay_t<I2>, Pred, Proj1, Proj2>
bool is_permutation( I1 first1, S1 last1, I2&& first2_, Pred pred = Pred{},

                     Proj1 proj1 = Proj1{}, Proj2 proj2 = Proj2{} );
(3) (Ranges TS)
(veraltet)
template< ForwardRange R1, class I2, class Pred = ranges::equal_to<>,

          class Proj1 = ranges::identity, class Proj2 = ranges::identity >
    requires ForwardIterator<std::decay_t<I2>> && !Range<I2> &&
             IndirectlyComparable<ranges::iterator_t<R1>, std::decay_t<I2>, Pred, Proj1, Proj2>
bool is_permutation( R1&& r1, I2&& first2_, Pred pred = Pred{},

                     Proj1 proj1 = Proj1{}, Proj2 proj2 = Proj2{} );
(4) (Ranges TS)
(veraltet)
1) Gibt true zurück, wenn es eine Permutation der Elemente im Bereich [first1last1) gibt, die den Bereich gleich [first2last2) macht, und false andernfalls.
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.
3) Ähnlich wie (1), außer dass first2 als durch std::decay_t<I2> first2 = std::forward<I2>(first2_); definiert wird und last2 gleich first2 + (last1 - first1) ist.
4) Dasselbe wie (3), verwendet aber r1 als ersten Quellbereich, als ob ranges::begin(r1) als first1 und ranges::end(r1) als last1 verwendet würden.

Zwei Bereiche werden als gleich betrachtet, wenn sie die gleiche Anzahl von Elementen haben und für jeden Iterator i im Bereich [first1last1) gilt: ranges::invoke(pred, ranges::invoke(proj1, *i), ranges::invoke(proj2, *(first2 + (i - first1)))) ist true.

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 erste Bereich der Elemente
r1 - der erste Bereich der Elemente
first2, last2 - der zweite Bereich der Elemente
r2 - der zweite Bereich der Elemente
first2_ - der Anfang des zweiten Bereichs der 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

true, wenn der Bereich [first1last1) eine Permutation des Bereichs [first2last2) ist.

[bearbeiten] Komplexität

Höchstens O(N2) Anwendungen des Prädikats und jeder Projektion, oder exakt N, wenn die Sequenzen bereits gleich sind, wobei N = last1 - first1.

Wenn jedoch SizedSentinel<S1, I1> && SizedSentinel<S2, I2> erfüllt ist und last1 - first1 != last2 - first2, werden keine Anwendungen des Prädikats und der Projektionen durchgeführt.

[bearbeiten] Beispiel

[bearbeiten] Siehe auch

bestimmt, ob eine Sequenz eine Permutation einer anderen Sequenz ist
(Funktionsvorlage) [editieren]
erzeugt die nächstgrößere lexikographische Permutation eines Bereichs von Elementen
(Funktionsvorlage) [bearbeiten]
erzeugt die nächstkleinere lexikographische Permutation eines Bereichs von Elementen
(Funktionsvorlage) [bearbeiten]