Trova Imposta intersezione in C++
-
Usa il metodo
std::set_intersection
per trovare l’intersezione di gruppo in C++ -
Usa il metodo
std::set_symmetric_difference
per trovare la differenza simmetrica impostata 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 )
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