Ce face std::is_permutation
std::is_permutation răspunde la întrebarea: se poate obține al doilea interval rearanjând primul? Exemplul clasic sunt anagramele.
Complexitatea este O(n²) în cel mai rău caz. Pentru intervale mari este mai rapid să sortezi copii ale lor și să le compari, sau să numeri aparițiile cu un std::unordered_map.
Parametri
| Parametru | Descriere |
|---|---|
first1, last1 |
Primul interval. |
first2, last2 |
Al doilea interval (last2 din C++14). |
Ce returnează
true dacă intervalele sunt permutări unul al celuilalt.
Exemple
Exemplul 1: Anagrame
#include <algorithm>
#include <print>
#include <string>
int main() {
std::string a = "rama";
std::string b = "arma";
std::string c = "mare";
std::println("{} / {}: {}", a, b, std::is_permutation(a.begin(), a.end(), b.begin(), b.end()));
std::println("{} / {}: {}", a, c, std::ranges::is_permutation(a, c));
}
Rezultat
rama / arma: true
rama / mare: false
Exemplul 2: Aceleași produse în coș
#include <algorithm>
#include <print>
#include <vector>
int main() {
std::vector<int> comanda{101, 205, 205, 330};
std::vector<int> livrat{205, 330, 101, 205};
std::println("Livrare completă: {}", std::ranges::is_permutation(comanda, livrat));
}
Rezultat
Livrare completă: true
Greșeli frecvente
- Folosești funcția pe vectori cu zeci de mii de elemente într-o buclă și programul devine lent din cauza complexității pătratice.
Comenzi înrudite
std::next_permutation: Transformă intervalul în următoarea (sau precedenta) permutare în ordine lexicografică.std::equal: Verifică dacă două intervale conțin aceleași elemente, în aceeași ordine.std::sort: Sortează elementele dintr-un interval, crescător sau după o regulă dată de tine.