반응형

이번 시간부터는 연관 컨테이너에 대해 알아보겠다.

연관 컨테이너는 일정 규칙에 따라 조직화하여 자료를 정렬하고 처리하는 컨테이너이다.

여기서 오늘 set 컨테이너에 대해 다뤄보려고 한다.


1. set이란?

set은 연관 컨테이너로 노드 기반 컨테이너이다.

균형 이진트리(중위순회)로 이루어져 있으며, key라고 하는 원소들의 집합으로 이루어져 있다.

여기서 key는 중복이 허용되지 않으며 중복이되는 key는 multiset으로 추후 설명할 예정이다.

 

원소 삽입시(insert) 자동 정렬되며, default 기준 오름차순정렬이다.

 

set을 사용하기 위해선 <set> 헤더파일을 include 해주어야하며,

std::set<[데이터타입]> [변수이름]; 형식으로 선언해 사용할 수 있다.

(using namespace std;로 std 생략하여 편하게 작성가능)

 

2. set - 생성자

set 생성자는 다음과 같이 사용 가능하다. 아래부터 데이터타입이 int라고 가정하고 작성하겠다.

  • set<int> s;
    • 빈 set 컨테이너 s 생성
  • set<int> s(predicate);
    • predicate 정렬 기준으로 빈 s 컨테이너 생성
  • set<int> s2(s);
    • s를 복사한 s2 컨테이너 생성

3. set - 멤버 함수

다음은 set 멤버 함수이다. (set<int> s 선언 기준)

 

- 멤버 함수

  • s.begin();
    • s의 맨 처음 원소를 가리키는 반복자 리턴
    • iterator = s.begin();
  • s.end();
    • s의 마지막 원소를 가리키는 반복자 리턴
    • iterator = s.end();
  • s.clear();
    • s의 모든 원소를 제거
  • s.size(), s.max_size();
    • s의 원소 갯수를 반환
    • s의 최대 사이즈 반환
  • s.empty();
    • s가 비어있는지 확인
  • s.count(3);
    • s에서 3이란 원소의 갯수 반환(중복안되므로 0 or 1)
  • s.insert(6);
    • s에 6이란 원소 삽입(자동 정렬)
    • 삽입 성공시 리턴값 pair<iterator, bool>에 pair.second 값으로 true, 삽입 실패시 false가 나옴(pair.first는 삽입한 원소 가리키는 반복자)
  • s.insert(iterator, 5);
    • s에서 iterator가 가리키는 위치부터 5를 삽입할 위치 탐색하여 삽입(균형 이진트리)
  • s.erase(iterator);
    • s에서 iterator가 가리키는 원소를 제거하고 다음 원소 가리키는 반복자 리턴
  • s.erase(start, end);
    • s에서 start부터 end 범위 원소 모두 제거
  • s.find(3);
    • s에서 3이란 원소 찾아 가리키는 반복자 반환, 없으면 s.end() 반환
  • s2.swap(s);
    • s와 s2 서로 데이터를 바꾼다.
  • s.upper_bound(4), s.lower_bound(5);
    • 4란 원소가 끝나는 구간 반복자
    • 5란 원소가 시작하는 구간 반복자
  • s.equal_range(3);
    • 3이란 원소가 시작하는 구간과 끝나느 구간 반복자 pair 객체 반환
  • s.key_comp(), s.value_comp();
    • 정렬 기준 조건자 반환(set에선 둘이 같음)

4. set - 연산자

set의 연산자이다.

  • ==, != 
    • == : 두 set 컨테이너의 모든 원소가 같으면 참, 아니면 거짓
    • != : 두 set 컨테이너에서 하나라도 원소가 다르면 참, 아니면 거짓
  • <, >, <=, >=
    • set 컨테이너간 크기 비교


5. set 구조 및 실습

위에서 설명한 set의 구조는 균형 이진트리로 다음 그림과 같다.



set 컨테이너를 이용하여 실습을 진행해보았다.

#include <iostream>
#include <set>
using namespace std;

int main(void) {
	set<int> s;
	set<int>::iterator sit;
	s.insert(3); cout << "3 원소 추가!" << endl;
	s.insert(7); cout << "7 원소 추가!" << endl;
	s.insert(2); cout << "2 원소 추가!" << endl;
	
	sit = s.begin();
	s.insert(sit, 6);
	cout << "s.begin()부터 탐색하여 6 원소 추가! \n" << endl;
	
	cout << "==========원소출력==========" << endl;
	for (sit = s.begin(); sit != s.end(); sit++) {
		cout << *sit << endl;
	}
	cout << "============================\n" << endl;

	s.erase(7); cout << "7 원소 삭제!" << endl;
	//s.erase(s.begin(), s.end()); // 모든 원소 삭제

	sit = s.upper_bound(3); cout << "3 원소 끝나는 구간에 반복자 지정" << endl;
	cout << "반복자가 가리키는 원소 : " << *sit << "\n" << endl;

	sit = s.find(6); cout << "6이라는 원소 찾기" << endl;
	if (sit != s.end()) {
		cout << *sit << " 원소가 존재 합니다." << endl;
	}
	else {
		cout << "해당 원소를 찾지 못했습니다." << endl;
	}
	
	return 0;
}

실행결과는 다음과 같다.


여기까지 set 공부를 마친다. 다음 시간엔 map에 대하여 알아보는 시간을 갖겠다.

반응형

'Programming > Language' 카테고리의 다른 글

[C++] STL - multimap 공부  (0) 2020.05.24
[C++] STL - map 공부  (0) 2020.05.14
[C++] STL - stack 공부  (0) 2020.05.11
[C++] STL - list 공부  (0) 2020.05.07
[C++] STL - vector 공부  (0) 2020.05.06

+ Recent posts