std::equal în C++

Verifică dacă două intervale conțin aceleași elemente, în aceeași ordine.

Sintaxă
bool equal(InputIt1 first1, InputIt1 last1, InputIt2 first2);
bool equal(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2);  // C++14

Ce face std::equal

std::equal compară element cu element. Varianta cu trei iteratori presupune că al doilea interval are cel puțin aceeași lungime ca primul și nu verifică dacă este mai lung. Varianta cu patru iteratori (C++14) compară și lungimile, deci este mai sigură.

Pentru două containere de același tip poți folosi direct a == b. std::equal este util pentru containere diferite (vector cu listă), părți din containere sau comparații cu un predicat.

Parametri

Parametru Descriere
first1, last1 Primul interval.
first2, last2 Al doilea interval (last2 este opțional).
egal Opțional. Predicat de comparare.

Ce returnează

true dacă intervalele sunt egale.

Exemple

Exemplul 1: Palindrom fără copiere

Primul interval este textul de la început, al doilea textul citit de la coadă cu rbegin().

#include <algorithm>
#include <print>
#include <string>

int main() {
    for (std::string cuvant : {"rotor", "radar", "rama"}) {
        bool palindrom = std::equal(cuvant.begin(), cuvant.end(), cuvant.rbegin());
        std::println("{}: {}", cuvant, palindrom);
    }
}

Rezultat

rotor: true
radar: true
rama: false

Exemplul 2: Vector și listă

#include <algorithm>
#include <list>
#include <print>
#include <vector>

int main() {
    std::vector<int> asteptat{1, 2, 3};
    std::list<int> primit{1, 2, 3, 4};

    std::println("3 iteratori: {}", std::equal(asteptat.begin(), asteptat.end(), primit.begin()));
    std::println("4 iteratori: {}", std::equal(asteptat.begin(), asteptat.end(), primit.begin(), primit.end()));
    std::println("ranges: {}", std::ranges::equal(asteptat, primit));
}

Rezultat

3 iteratori: true
4 iteratori: false
ranges: false

Greșeli frecvente

  • Folosești varianta cu 3 iteratori când al doilea interval este mai scurt: citire în afara lui, comportament nedefinit. Preferă varianta cu 4 iteratori sau std::ranges::equal.

Comenzi înrudite

  • std::mismatch: Găsește prima poziție unde două intervale diferă și returnează iteratorii din ambele.
  • std::is_permutation: Verifică dacă două intervale conțin aceleași elemente, de același număr de ori, în orice ordine.
  • std::lexicographical_compare: Compară două intervale ca în dicționar și spune dacă primul vine înaintea celui de-al doilea.
  • std::search: Caută prima apariție a unei secvențe de elemente în interiorul altui interval.