std::set_intersection în C++

Calculează intersecția a două intervale sortate: elementele care apar în ambele.

Sintaxă
OutputIt set_intersection(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2, OutputIt d_first);

Ce face std::set_intersection

std::set_intersection scrie la destinație, în ordine, elementele comune celor două intervale sortate. Un element care apare de m ori într-unul și de n ori în celălalt apare de min(m, n) ori în rezultat.

Lucrează în timp liniar, pentru că avansează simultan prin cele două intervale. Pentru vectori nesortați, sortează-i întâi.

Parametri

Parametru Descriere
first1, last1 Primul interval sortat.
first2, last2 Al doilea interval sortat.
d_first Destinația.

Ce returnează

Iterator după ultimul element scris.

Exemple

Exemplul 1: Prieteni comuni

#include <algorithm>
#include <iterator>
#include <print>
#include <set>
#include <string>
#include <vector>

int main() {
    std::set<std::string> prieteni_ana{"Bianca", "Dan", "Ioana", "Mihai"};
    std::set<std::string> prieteni_ion{"Andrei", "Dan", "Mihai", "Sorin"};
    std::vector<std::string> comuni;

    std::set_intersection(prieteni_ana.begin(), prieteni_ana.end(), prieteni_ion.begin(), prieteni_ion.end(),
                          std::back_inserter(comuni));
    std::println("Prieteni comuni: {}", comuni);
}

Rezultat

Prieteni comuni: ["Dan", "Mihai"]

Exemplul 2: Vectori nesortați: sortează întâi

#include <algorithm>
#include <iterator>
#include <print>
#include <vector>

int main() {
    std::vector<int> bilete_luni{42, 7, 19, 3, 25};
    std::vector<int> bilete_marti{25, 8, 42, 11};

    std::ranges::sort(bilete_luni);
    std::ranges::sort(bilete_marti);

    std::vector<int> ambele_zile;
    std::ranges::set_intersection(bilete_luni, bilete_marti, std::back_inserter(ambele_zile));
    std::println("{}", ambele_zile);
}

Rezultat

[25, 42]

Greșeli frecvente

  • Uiți să sortezi și obții o intersecție incompletă, fără nicio eroare.

Comenzi înrudite

  • std::set_union: Calculează reuniunea a două intervale sortate: elementele care apar în oricare dintre ele, fără dubluri între ele.
  • std::set_difference: Calculează diferența a două intervale sortate: elementele din primul care nu apar în al doilea.
  • std::includes: Verifică dacă toate elementele unui interval sortat se află și în alt interval sortat (submulțime).