std::set_union în C++

Calculează reuniunea a două intervale sortate: elementele care apar în oricare dintre ele, fără dubluri între ele.

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

Ce face std::set_union

std::set_union scrie la destinație, sortat, fiecare element care apare în primul sau în al doilea interval. Un element comun apare o singură dată. Dacă un element apare de m ori în primul și de n ori în al doilea, în rezultat apare de max(m, n) ori.

Spre deosebire de std::merge, care păstrează toate elementele, reuniunea nu dublează elementele comune. Sursele trebuie să fie sortate.

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: Cursuri alese de doi studenți

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

int main() {
    std::set<std::string> ana{"Algebră", "Fizică", "Informatică"};
    std::set<std::string> ion{"Chimie", "Fizică", "Informatică"};
    std::vector<std::string> toate;

    std::set_union(ana.begin(), ana.end(), ion.begin(), ion.end(), std::back_inserter(toate));
    std::println("{}", toate);
}

Rezultat

["Algebră", "Chimie", "Fizică", "Informatică"]

Exemplul 2: Merge față de set_union

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

int main() {
    std::vector<int> a{1, 2, 3};
    std::vector<int> b{2, 3, 4};
    std::vector<int> m;
    std::vector<int> u;

    std::ranges::merge(a, b, std::back_inserter(m));
    std::ranges::set_union(a, b, std::back_inserter(u));

    std::println("merge:     {}", m);
    std::println("set_union: {}", u);
}

Rezultat

merge:     [1, 2, 2, 3, 3, 4]
set_union: [1, 2, 3, 4]

Greșeli frecvente

  • Scrii rezultatul într-un std::set cu set.begin() ca destinație: nu compilează. Folosește std::inserter(s, s.end()).

Comenzi înrudite

  • std::set_intersection: Calculează intersecția a două intervale sortate: elementele care apar în ambele.
  • std::set_difference: Calculează diferența a două intervale sortate: elementele din primul care nu apar în al doilea.
  • std::merge: Combină două intervale sortate într-un singur interval sortat, păstrând toate elementele.
  • std::includes: Verifică dacă toate elementele unui interval sortat se află și în alt interval sortat (submulțime).