std::set_difference în C++

Calculează diferența a două intervale sortate: elementele din primul care nu apar în al doilea.

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

Ce face std::set_difference

std::set_difference scrie la destinație elementele primului interval care lipsesc din al doilea. Ordinea argumentelor contează: A − B nu este același lucru cu B − A.

Pentru elementele care apar în exact unul dintre intervale (diferența simetrică) există std::set_symmetric_difference.

Parametri

Parametru Descriere
first1, last1 Intervalul din care se scade (sortat).
first2, last2 Intervalul scăzut (sortat).
d_first Destinația.

Ce returnează

Iterator după ultimul element scris.

Exemple

Exemplul 1: Cine nu a predat tema

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

int main() {
    std::set<std::string> clasa{"Ana", "Bogdan", "Cristina", "Dan", "Elena"};
    std::set<std::string> au_predat{"Ana", "Dan", "Elena"};
    std::vector<std::string> restante;

    std::set_difference(clasa.begin(), clasa.end(), au_predat.begin(), au_predat.end(),
                        std::back_inserter(restante));
    std::println("Nu au predat: {}", restante);
}

Rezultat

Nu au predat: ["Bogdan", "Cristina"]

Exemplul 2: Ordinea contează

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

int main() {
    std::vector<int> a{1, 2, 3, 4};
    std::vector<int> b{3, 4, 5};
    std::vector<int> a_minus_b;
    std::vector<int> b_minus_a;

    std::ranges::set_difference(a, b, std::back_inserter(a_minus_b));
    std::ranges::set_difference(b, a, std::back_inserter(b_minus_a));

    std::println("A - B = {}", a_minus_b);
    std::println("B - A = {}", b_minus_a);
}

Rezultat

A - B = [1, 2]
B - A = [5]

Greșeli frecvente

  • Inversezi argumentele și obții elementele care lipsesc din cealaltă parte.

Comenzi înrudite

  • std::set_intersection: Calculează intersecția a două intervale sortate: elementele care apar în ambele.
  • std::set_union: Calculează reuniunea a două intervale sortate: elementele care apar în oricare dintre ele, fără dubluri între ele.
  • std::remove_if: Elimină logic elementele care îndeplinesc o condiție; folosit cu erase sau înlocuit de std::erase_if (C++20).