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).