std:: is_permutation
|
Definiert im Header
<algorithm>
|
||
|
template
<
class
ForwardIt1,
class
ForwardIt2
>
bool
is_permutation
(
ForwardIt1 first1, ForwardIt1 last1,
|
(1) |
(seit C++11)
(constexpr seit C++20) |
|
template
<
class
ForwardIt1,
class
ForwardIt2,
class
BinaryPredicate
>
|
(2) |
(seit C++11)
(constexpr seit C++20) |
|
template
<
class
ForwardIt1,
class
ForwardIt2
>
bool
is_permutation
(
ForwardIt1 first1, ForwardIt1 last1,
|
(3) |
(seit C++14)
(constexpr seit C++20) |
|
template
<
class
ForwardIt1,
class
ForwardIt2,
class
BinaryPredicate
>
|
(4) |
(seit C++14)
(constexpr seit C++20) |
Überprüft, ob
[
first1
,
last1
)
eine
Permutation
eines Bereichs ist, der bei
first2
beginnt:
- Für Überladungen (1,2) hat der zweite Bereich std:: distance ( first1, last1 ) Elemente.
-
Für Überladungen
(3,4)
ist der zweite Bereich
[first2,last2).
Wenn
ForwardIt1
und
ForwardIt2
unterschiedliche
Werttypen
haben, ist das Programm fehlerhaft.
Wenn die Vergleichsfunktion keine Äquivalenzrelation ist, ist das Verhalten undefiniert.
Inhaltsverzeichnis |
Parameter
| first1, last1 | - | das Paar von Iteratoren, das den ersten Bereich der zu vergleichenden Elemente definiert |
| first2, last2 | - | das Paar von Iteratoren, das den zweiten Bereich der zu vergleichenden Elemente definiert |
| p | - |
binäres Prädikat, das
true
zurückgibt, wenn die Elemente als gleich behandelt werden sollen.
Die Signatur der Prädikatfunktion sollte äquivalent zu Folgendem sein: bool pred ( const Type1 & a, const Type2 & b ) ;
Obwohl die Signatur keine
const
&
benötigt, darf die Funktion die übergebenen Objekte nicht modifizieren und muss alle Werte der Typen (möglicherweise const)
|
| Typanforderungen | ||
-
ForwardIt1, ForwardIt2
müssen die Anforderungen von
LegacyForwardIterator
erfüllen.
|
||
Rückgabewert
true
falls der Bereich
[
first1
,
last1
)
eine Permutation des Bereichs
[
first2
,
last2
)
ist,
false
andernfalls.
Komplexität
Gegeben N als std:: distance ( first1, last1 ) :
) Vergleiche im schlimmsten Fall.
) Anwendungen im schlimmsten Fall.
ForwardIt1
und
ForwardIt2
beide
LegacyRandomAccessIterator
sind und
last1
-
first1
!
=
last2
-
first2
true
ist, werden keine Vergleiche durchgeführt.
) Vergleiche im schlimmsten Fall.
) Anwendungen im schlimmsten Fall.
Mögliche Implementierung
template<class ForwardIt1, class ForwardIt2> bool is_permutation(ForwardIt1 first, ForwardIt1 last, ForwardIt2 d_first) { // gemeinsamen Präfix überspringen std::tie(first, d_first) = std::mismatch(first, last, d_first); // über den Rest iterieren, zählend wie oft jedes Element // aus [first, last) in [d_first, d_last) erscheint if (first != last) { ForwardIt2 d_last = std::next(d_first, std::distance(first, last)); for (ForwardIt1 i = first; i != last; ++i) { if (i != std::find(first, i, *i)) continue; // dieses *i wurde bereits geprüft auto m = std::count(d_first, d_last, *i); if (m == 0 || std::count(i, last, *i) != m) return false; } } return true; } |
Hinweis
Die
std::is_permutation
kann im
Testen
verwendet werden, nämlich um die Korrektheit von Umordnungsalgorithmen (z.B. Sortieren, Mischen, Partitionieren) zu überprüfen. Wenn
x
ein ursprünglicher Bereich und
y
ein
permutierter
Bereich ist, dann bedeutet
std
::
is_permutation
(
x, y
)
==
true
, dass
y
aus
"denselben"
Elementen besteht, die möglicherweise an anderen Positionen stehen.
Beispiel
#include <algorithm> #include <iostream> template<typename Os, typename V> Os& operator<<(Os& os, const V& v) { os << "{ "; for (const auto& e : v) os << e << ' '; return os << '}'; } int main() { static constexpr auto v1 = {1, 2, 3, 4, 5}; static constexpr auto v2 = {3, 5, 4, 1, 2}; static constexpr auto v3 = {3, 5, 4, 1, 1}; std::cout << v2 << " ist eine Permutation von " << v1 << ": " << std::boolalpha << std::is_permutation(v1.begin(), v1.end(), v2.begin()) << '\n' << v3 << " ist eine Permutation von " << v1 << ": " << std::is_permutation(v1.begin(), v1.end(), v3.begin()) << '\n'; }
Ausgabe:
{ 3 5 4 1 2 } ist eine Permutation von { 1 2 3 4 5 }: true
{ 3 5 4 1 1 } ist eine Permutation von { 1 2 3 4 5 }: false
Siehe auch
|
erzeugt die nächstgrößere lexikografische Permutation eines Elementbereichs
(Funktions-Template) |
|
|
erzeugt die nächstkleinere lexikografische Permutation eines Elementbereichs
(Funktions-Template) |
|
|
(C++20)
|
spezifiziert, dass eine
relation
eine Äquivalenzrelation definiert
(Konzept) |
|
(C++20)
|
bestimmt, ob eine Sequenz eine Permutation einer anderen Sequenz ist
(Algorithmus-Funktionsobjekt) |