C++에서 집합 교차 찾기
-
std::set_intersection
메서드를 사용하여 C++에서 집합 교차점 찾기 -
std::set_symmetric_difference
메서드를 사용하여 C++에서 집합 대칭 차이 찾기
이 기사에서는 C++에서 집합 교차점을 찾는 방법에 대한 몇 가지 방법을 설명합니다.
std::set_intersection
메서드를 사용하여 C++에서 집합 교차점 찾기
std::set_intersection
메소드는<algorithm>
헤더에 포함 된 C++ 알고리즘 라이브러리의 일부입니다. set_intersection
알고리즘 작업은std::set
객체로 제한되지 않고 범위 기반 객체를 처리 할 수 있습니다. std::vector
입니다. set_intersection
알고리즘에 전달하기 전에 두 입력 범위를 모두 정렬해야합니다.
다음 예에서는 두 개의std::set
변수를 선언하고 임의의string
유형 요소로 초기화합니다. set_intersection
함수의 처음 4 개 매개 변수는 해당 객체의 범위 반복자이며 다섯 번째 인수는 계산 된 교차가 저장되는 범위의 시작입니다. 이 경우 이러한 요소를 보유하기 위해std::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() {
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);
}
출력:
s1 ∩ s2: ( array, deque, list, map, multimap, set, span, vector )
std::set_intersection
은 사용자가 지정한대로 교차 요소를 저장하지만 입력 범위 중 하나와 겹치는 범위가 아니어야합니다. 알아 두어야 할 또 다른 중요한 점은 교차 요소를 저장하기에 충분한 공간이있는 대상 범위를 지정하는 것입니다. 이를위한 유연한 방법은 동적 배열std::vector
를 사용하고std::back_inserter
메서드를 사용하여 요소를 객체에 푸시하는 것입니다. 대상 매개 변수로 메모리를 예약하지 않고vector.begin()
반복자를 지정하면 알고리즘에서 세그멘테이션 오류가 발생할 수 있습니다. 다음 예제는vector
객체에 대한set_intersection
메소드를 보여줍니다.
#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);
}
출력:
v1 ∩ v2: ( 1, 2, 7 )
std::set_symmetric_difference
메서드를 사용하여 C++에서 집합 대칭 차이 찾기
C++ 표준 라이브러리의 또 다른 알고리즘은 입력 범위 중 하나에서만 발견되는 요소를 검색하는std::set_symmetric_difference
입니다. 함수 매개 변수는std::set_intersection
메소드와 유사합니다. 두 알고리즘 모두 정렬 된 범위를 취하고 발견 된 요소도 정렬 된 방식으로 저장합니다. std::set
컨테이너는 기본적으로 정렬 된 요소를 포함합니다. 따라서 입력 범위로 직접 전달할 수 있습니다. 반면,std::vector
콘텐츠는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);
}
출력:
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