set은 중복없이 저장하는 자료구조이다. 집합이라고 생각하면 된다.

set을 사용하려면 #include <set>으로 <set> 헤더파일을 포함시켜야 한다.

set은 템플릿 클래스이기 때문에 set 객체를 선언할 때에는 set에 들어갈 원소들의 타입을 적어줘야 한다.

선언 방법은 다음과 같다.

set<int> s;

<> 안에는 set 원소의 타입을 적으면 된다.

double 타입의 원소를 가지는 set을 만들고 싶다면

set<double> s;

하면 된다.

그리고 이 set 객체에 원소를 집어넣고 싶으면

s.insert(3);

이렇게 하면 된다.

 

int arr[10] = { 1, 1, 2, 3, 4, 4, 5, 5, 6, 7 };

이렇게 1, 4, 5가 각각 2개씩 중복되서 있는 배열을 set에 넣어보자.

 

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

int main() {
	int arr[10] = { 1, 1, 2, 3, 4, 4, 5, 5, 6, 7 };
	set<int> s;
	for (int i = 0; i < 10; i++) {
		s.insert(arr[i]);
	}
	cout << "set s의 크기: " << s.size() << endl;
	return 0;
}

이 코드의 실행 결과는 다음과 같다.

배열 arr의 원소 10개를 set에 집어넣었지만 set에는 7개의 원소 밖에 없다.

중복된 원소는 집어넣지 않기 때문이다.

 

set은 배열처럼 s[3] 이런 식으로 인덱스로 접근할 수 없다.

set을 순회하고 싶다면 다음과 같이 해야 한다.

for (set<int>::iterator iter = s.begin(); iter != s.end(); iter++) {
	cout << *iter << " ";
}

iterator는 포인터이다. 포인터는 주소를 담고 있기 때문에 그 주소에 있는 을 출력해보려면 * 연산자로 접근해야 한다. *iter 이렇게 말이다.

s.begin()은 set의 시작 주소이다. for문 헤더에서 iterator를 s.begin()으로 초기화한다. 그러면 iter는 set의 시작 주소를 가리키게(저장하게) 된다.

그리고 for문으로 진입한다.

for문에 진입해서는 역참조연산자 *를 이용해서 set의 원소의 값을 출력한다.

그리고 iter++을 통해 그 주소를 4바이트만큼(int 타입이므로) 증가한다. 이 과정을 set의 마지막 주소에 가기 전까지 반복하면 된다.

 

이 코드의 실행 결과는 다음과 같다.

arr의 원소가 중복 없이 들어가 있는 것을 볼 수 있다.

 

set에 있는 원소를 삭제하고 싶으면

s.erase(1);

이렇게 해주면 된다.

 

이렇게 1을 삭제하고 다시 s를 출력해보면

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

int main() {
	int arr[10] = { 1, 1, 2, 3, 4, 4, 5, 5, 6, 7 };
	set<int> s;
	for (int i = 0; i < 10; i++) {
		s.insert(arr[i]);
	}
	s.erase(1);
	for (set<int>::iterator iter = s.begin(); iter != s.end(); iter++) {
		cout << *iter << " ";
	}
	cout << endl;
	system("pause");
	return 0;
}

위 코드의 실행 결과

1이 사라진 것을 볼 수 있다.

 

set 객체가 비어있는지 확인하려면 s.empty()를 해보면 된다. s.size()가 0이면 비어있는 것이므로 1(true)을 리턴하고 아니라면 0(false)을 리턴한다.

+ Recent posts