Trova Imposta intersezione in C++

Jinku Hu 30 gennaio 2023
  1. Usa il metodo std::set_intersection per trovare l’intersezione di gruppo in C++
  2. Usa il metodo std::set_symmetric_difference per trovare la differenza simmetrica impostata in C++
Trova Imposta intersezione in C++

Questo articolo spiegherà diversi metodi su come trovare l’intersezione di insiemi in C++.

Usa il metodo std::set_intersection per trovare l’intersezione di gruppo in C++

Il metodo std::set_intersection fa parte della libreria degli algoritmi C++, inclusa nell’intestazione <algorithm>. L’operazione dell’algoritmo set_intersection non è limitata agli oggetti std::set, ma piuttosto può elaborare qualsiasi oggetto basato su intervallo, ad es. std::vector. Nota che entrambi gli intervalli di input devono essere ordinati prima di essere passati a un algoritmo set_intersection.

Nell’esempio seguente, dichiariamo due variabili std::set e le inizializziamo con elementi di tipo string arbitrari. I primi quattro parametri della funzione set_intersection sono iteratori di intervallo da oggetti corrispondenti e il quinto argomento è l’inizio dell’intervallo in cui è memorizzata l’intersezione calcolata. In questo caso, dichiariamo un std::vector per contenere questi elementi.

#include <iostream>
#include <vector>
#include <string>
#include <set>
#include <algorithm>

using std::cout; using std::endl;
using std::cin; using std::string;
using std::set; using std::vector;

template<typename T>
void printVectorElements(vector<T> &vec)
{
    cout << "{ ";
    for (const auto &item : vec) {
        cout << item << ", ";
    }
    cout << "\b\b }" << endl;
}

int main() {
    set<string> s1 {"array", "vector",
                    "deque", "list",
                    "set", "map",
                    "multimap", "span"};
    set<string> s2(s1);
    s2.insert("stack");
    s2.insert("queue");

    vector<string> s1s2_intsec;

    std::set_intersection(s1.begin(), s1.end(),
                          s2.begin(), s2.end(),
                          std::back_inserter(s1s2_intsec));

    cout << "s1 ∩ s2: ";
    printVectorElements(s1s2_intsec);

    exit(EXIT_SUCCESS);
}

Produzione:

s1 ∩ s2: ( array, deque, list, map, multimap, set, span, vector )

Anche se std::set_intersection memorizza gli elementi di intersezione come specificato dall’utente, non deve essere l’intervallo che si sovrappone a nessuno degli intervalli di input. Un altro punto importante di cui essere consapevoli è specificare l’intervallo di destinazione, che dispone di spazio sufficiente per memorizzare gli elementi di intersezione. Il metodo flessibile per questo sarebbe usare un array dinamico std::vector e usare il metodo std::back_inserter per spingere gli elementi all’oggetto. Se specifichi l’iteratore vector.begin() senza riservare la memoria come parametro di destinazione, l’algoritmo potrebbe generare un errore di segmentazione. Il prossimo esempio mostra il metodo set_intersection su oggetti vector.

#include <iostream>
#include <vector>
#include <string>
#include <set>
#include <algorithm>

using std::cout; using std::endl;
using std::cin; using std::string;
using std::set; using std::vector;

template<typename T>
void printVectorElements(vector<T> &vec)
{
    cout << "{ ";
    for (const auto &item : vec) {
        cout << item << ", ";
    }
    cout << "\b\b }" << endl;
}

int main() {
    vector<int> v1v2_intsec;
    vector<int> v1 {9,7,5,1,2};
    vector<int> v2 {4,3,2,1,7,8};
    std::sort(v1.begin(), v1.end());
    std::sort(v2.begin(), v2.end());

    std::set_intersection(v1.begin(), v1.end(),
                          v2.begin(), v2.end(),
                          std::back_inserter(v1v2_intsec));
    cout << "v1 ∩ v2: ";
    printVectorElements(v1v2_intsec);

    exit(EXIT_SUCCESS);
}

Produzione:

v1 ∩ v2: ( 1, 2, 7 )

Usa il metodo std::set_symmetric_difference per trovare la differenza simmetrica impostata in C++

Un altro algoritmo della libreria standard C++ è std::set_symmetric_difference, che ricerca gli elementi trovati solo in uno degli intervalli di input. I parametri della funzione sono simili al metodo std::set_intersection. Entrambi gli algoritmi prendono intervalli ordinati e memorizzano anche gli elementi trovati in modo ordinato. Nota che il contenitore std::set contiene di default elementi ordinati. Quindi può essere passato direttamente come intervallo di input. Mentre i contenuti di std::vector devono essere ordinati esplicitamente prima di essere elaborati da std::set_symmetric_difference.

#include <iostream>
#include <vector>
#include <string>
#include <set>
#include <algorithm>

using std::cout; using std::endl;
using std::cin; using std::string;
using std::set; using std::vector;

template<typename T>
void printVectorElements(vector<T> &vec)
{
    cout << "{ ";
    for (const auto &item : vec) {
        cout << item << ", ";
    }
    cout << "\b\b }" << endl;
}

int main() {
    vector<int> v1 {9,7,5,1,2};
    vector<int> v2 {4,3,2,1,7,8};
    std::sort(v1.begin(), v1.end());
    std::sort(v2.begin(), v2.end());

    vector<int> v1v2_symdif;
    std::set_symmetric_difference(v1.begin(), v1.end(),
                          v2.begin(), v2.end(),
                          std::back_inserter(v1v2_symdif));
    cout << "v1 △ v2: ";
    printVectorElements(v1v2_symdif);

    exit(EXIT_SUCCESS);
}

Produzione:

v1 △ v2: ( 3, 4, 5, 8, 9 )
Autore: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Articolo correlato - C++ Set