std::is_permutation în C++

Verifică dacă două intervale conțin aceleași elemente, de același număr de ori, în orice ordine.

Sintaxă
bool is_permutation(ForwardIt1 first1, ForwardIt1 last1, ForwardIt2 first2, ForwardIt2 last2);

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.