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)을 리턴한다.
'C++' 카테고리의 다른 글
[C++] <queue> 라이브러리, 우선순위 큐, 최대 힙, 최소 힙 (3) | 2020.02.04 |
---|---|
[C++] vector (벡터) 정렬, 배열 정렬하기 (0) | 2020.02.03 |
[C++] <tuple> 라이브러리 - tuple, pair (0) | 2020.01.30 |
[C++] 포인터 사용 시 주의 사항 (0) | 2020.01.30 |
[C++] 포인터 (1) | 2020.01.27 |