C++에서 STL 세트 컨테이너 사용

Jinku Hu 2023년10월12일
  1. std::set을 사용하여 C++에서 Set Container Object 선언
  2. insert멤버 함수를 사용하여 C++에서 집합에 요소 삽입
  3. find멤버 함수를 사용하여 C++에서 주어진 키를 가진 요소의 반복자를 검색합니다
  4. contains멤버 함수를 사용하여 주어진 키를 가진 요소가 C++의 집합에 존재하는지 확인
C++에서 STL 세트 컨테이너 사용

이 기사는 C++에서 STL set컨테이너를 사용하는 방법에 대한 여러 방법을 보여줍니다.

std::set을 사용하여 C++에서 Set Container Object 선언

std::set명령은 정렬 된 고유 개체 집합을 연관 컨테이너로 구현합니다. 요소는 기본적으로std::less비교 함수로 정렬되지만 사용자는 두 번째 템플릿 인수로 사용자 지정 함수를 제공 할 수 있습니다. 동일한 헤더는 중복을 필터링하지 않고 여러 값을 저장할 수있는std::multiset컨테이너도 제공합니다.

다음 예제에서는 이니셜 라이저 목록 생성자를 사용하여 두 세트 객체를 모두 생성합니다. 우리는 또한 주어진 키로 세트에 존재하는 요소의 수를 검색하는count멤버 함수를 사용합니다. 이 함수는std::multiset컨테이너에 더 내장되어 있지만std::set개체에서 호출 할 때 동일한 함수를 사용하여 요소가 존재하는지 확인할 수 있습니다.

#include <iostream>
#include <set>

using std::cout;
using std::endl;
using std::multiset;
using std::set;

template <typename T>
void printSet(set<T> s) {
  for (const auto &item : s) {
    cout << item << "; ";
  }
  cout << endl;
}

template <typename T>
void printMultiSet(multiset<T> s) {
  for (const auto &item : s) {
    cout << item << "; ";
  }
  cout << endl;
}

#define STR(num) #num

int main() {
  std::set<int> s1 = {1, 1, 1, 2, 2, 3};
  printSet(s1);

  std::multiset<int> s2 = {1, 1, 1, 2, 2, 3};
  printMultiSet(s2);
  std::cout << STR(s2) << " contains " << s2.count(1) << "ones" << endl;
  std::cout << STR(s2) << " contains " << s2.count(2) << "twos" << endl;

  return EXIT_SUCCESS;
}

출력:

1; 2; 3;
1; 1; 1; 2; 2; 3;
s2 contains 3 ones
s2 contains 2 twos

insert멤버 함수를 사용하여 C++에서 집합에 요소 삽입

insert함수에는 여러 오버로드가 있지만 집합에 추가 할 요소를 나타내는 단일 인수를 사용하는 버전을 사용합니다. 이insert오버로드는 반복기의std::pair객체와bool을 반환합니다.

후자는 삽입이 성공했는지를 나타내며, 그렇다면true값을 갖습니다. 반면에 반복자는 작업이 성공하면 삽입 된 요소를 가리 킵니다. 실패하면 삽입을 방해 한 요소를 가리 킵니다. 삽입 작업은 컨테이너 크기에 대수 복잡성이 있습니다.

#include <cassert>
#include <iostream>
#include <set>

using std::cout;
using std::endl;
using std::multiset;
using std::set;

int main() {
  std::set<int> s1 = {1, 1, 1, 2, 2, 3};

  auto ret = s1.insert(5);
  assert(*ret.first == 5);
  if (ret.second) std::cout << "Inserted!" << endl;

  ret = s1.insert(1);
  assert(*ret.first == 1);
  if (!ret.second) std::cout << "Not inserted!" << endl;

  return EXIT_SUCCESS;
}

출력:

Inserted!
Not inserted!

find멤버 함수를 사용하여 C++에서 주어진 키를 가진 요소의 반복자를 검색합니다

find함수는 주어진 키를 사용하여 요소에 반복기를 리턴 할 수있는std::set컨테이너의 또 다른 유용한 멤버 함수입니다. 집합에 그러한 요소가 없으면 과거의 반복자가 반환됩니다. 이것은 사용자가 성공적인 함수 호출을 확인하는 데 도움이됩니다.

#include <iostream>
#include <set>

using std::cout;
using std::endl;
using std::multiset;
using std::set;

int main() {
  std::set<int> s1 = {1, 1, 1, 2, 2, 3};

  auto search = s1.find(2);
  if (search != s1.end()) {
    cout << "Found " << (*search) << endl;
  } else {
    cout << "Not found" << endl;
  }

  return EXIT_SUCCESS;
}

출력:

Found 2

contains멤버 함수를 사용하여 주어진 키를 가진 요소가 C++의 집합에 존재하는지 확인

C++ 20 언어 표준부터std::set는 지정된 키를 가진 요소가 세트 객체에 존재하는지 확인하는 더 간단한 인터페이스 인 멤버 함수contains를 제공합니다. 이 함수는 부울 값을 반환하여 그러한 요소가 세트에 있는지 여부를 나타냅니다. 이 함수의 실행 시간 복잡도는 컨테이너 크기에서 로그입니다.

#include <iostream>
#include <set>

using std::cout;
using std::endl;
using std::multiset;
using std::set;

int main() {
  std::set<int> s3 = {91, 123, 63, 122, 22, 53};

  for (int x : {22, 23, 53, 54}) {
    if (s3.contains(x)) {
      cout << x << ": Found\n";
    } else {
      cout << x << ": Not found\n";
    }
  }

  return EXIT_SUCCESS;
}

출력:

22: Found
23: Not found
53: Found
54: Not found
작가: 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