목차.
개요
C++에서 'set'은 데이터를 저장하는 데 사용되는 컨테이너 중 하나로, 중복된 값을 허용하지 않는 정렬된 컨테이너입니다.
'set'은 특히 고유한 값의 컬렉션을 다룰 때 유용하며, STL(Standard Template Library)에서 제공하는 중요한 데이터 구조 중 하나입니다.
이 글에서는 C++에서 'set' 컨테이너를 소개하고 사용하는 방법에 대해 설명하겠습니다.
set의 형태
set 컨테이너를 사용하기 위해서 <set>헤더를 추가해줘야 합니다.
set<데이터 타입> 변수명
- set<int> mySet;
다음과 같이 선언 시 default로 size는 0이 된다.
set<데이터 타입> 변수명 = {요소}
- set<int> mySet= {1,2,3,4,5};
선언과 동시에 초기화를 하는 모습이다.
set<데이터 타입> 변수명(변수명)
- set<int> mySet(yourSet);
set의 특징
- 표준 라이브러리(STL)에서 제공하는 컨테이너
- 노드 기반으로 균형 이진 탐색 트리(binary search tree)
- 정렬된 원소들을 저장
- 중복을 허용하지 않음
- 기본적으로 오름차순으로 정렬
- 이진 탐색 트리기반으로 삽입, 삭제, 검색 연산이 모두 O(log n)의 시간복잡도
중복 값 제거
- set 컨테이너에 1, 2, 4를 각 2번씩 할당하면
중복된 값이 제거되고 1, 2, 4만 저장이 됩니다.
오름차순 정렬
- set 컨테이너에 5, 3, 6, 2, 1을 할당하면
값이 자동으로 오름차순 정렬되어 저장이 됩니다.
set의 기능
기능을 설명하기 앞서 반복자란?
반복자(iterator)
- 형태 : set<데이터 타입>::iterator 변수명;
- set 컨테이너에서 사용되는 반복자 타입
- 반복자는 컨테이너의 원소들에 순차적으로 접근하고 조작하기 위한 방법을 제공하는 객체
begin() / end() : 반복자(iterator)의 시작과 끝을 반환
set<int> mySet= { 5, 2, 10, 7, 15 };
// 첫번째 원소 출력
set<int>::iterator it_begin = mySet.begin();
cout << "첫번째 원소는: " << *it_begin << endl;
// 마지막 원소 출력, end()는 마지막 원소의 다음위치를 반환
set<int>::iterator it_end = mySet.end();
cout << "마지막 원소는: " << *(--it_end) << endl;
// 모든 원소 출력
for (set<int>::iterator it = mySet.begin(); it != mySet.end(); ++it)
{
cout << *it << " ";
}
find() : 특정 원소를 검색, 원소를 찾지 못하면 end() 반환, 기본적으로 반복자를 반환
set<int>::iterator it = mySet.find(7);
if (it != mySet.end()) {
cout << "7발견"<< endl;
} else {
cout << "7미발견" << endl;
}
insert() : 원소를 삽입
set<int> mySet = {5, 2, 10, 7, 15};
set<int>::iterator it = mySet.find(7);
if (it != mySet.end()) {
mySet.insert(it, 8);
}
erase() : 특정 원소 또는 원소의 범위를 삭제
set<int> mySet = { 5, 2, 10, 7, 15 };
set<int>::iterator it_begin = mySet.find(2);
set<int>::iterator it_end = mySet.find(7);
mySet.erase(it_begin, it_end);
clear() : 모든 원소를 삭제
count() : 특정 원소가 set에 있는지 개수를 반환
empty() : set이 비어있는지 여부를 확인
size() : set에 저장된 원소의 개수 반환
결론
set 컨테이너는 c++에서 중복을 허용하지 않는 고유한 값의 컬렉션을 관리하는 데 유용한 데이터 구조입니다.
값의 자동 정렬과 빠른 검색을 제공하며, 데이터 삽입 및 삭제도 효율적으로 처리할 수 있습니다.
이번 글에서 set의 개념과 특징, 그리고 각종 기능들에 대해서 알아봤습니다.
'프로그래밍 > C++' 카테고리의 다른 글
[C++] 공백을 포함한 문자열 입력받기(getline) (0) | 2023.07.31 |
---|---|
[C++] 아스키 코드를 정수로 변환하기 (0) | 2023.07.31 |
[C++] 문자를 아스키 코드로 형변환 하는법 (0) | 2023.07.31 |
[C++] 배열 정적 할당과 동적 할당 (0) | 2023.07.22 |
[C++] 입력과 출력 (0) | 2023.06.29 |