C++에서 집합 교차 찾기

Jinku Hu 2023년1월30일
  1. std::set_intersection 메서드를 사용하여 C++에서 집합 교차점 찾기
  2. std::set_symmetric_difference 메서드를 사용하여 C++에서 집합 대칭 차이 찾기
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 )
작가: 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

관련 문장 - C++ Set