이 글에서는 C++ STL의 set::insert() 함수에 대해 자세히 알아봅니다. 함수의 문법, 동작 원리, 반환 값은 물론 실제 예제 코드까지 함께 살펴보겠습니다.
C++ STL에서 set이란?
C++ STL의 set은 중복되지 않는 고유한(unique) 요소들을 정렬된 순서로 저장하는 컨테이너입니다. 요소의 값 자체가 그 요소를 식별하는 기준이 되기 때문에 set에는 반드시 유일한 값만 저장됩니다. 한 번 set에 추가된 값은 나중에 수정할 수 없지만, 값을 삭제하거나 새로 추가하는 것은 언제든 가능합니다. 내부적으로 set은 이진 탐색 트리(binary search tree) 구조로 구현되어 있어 빠른 탐색이 가능합니다.
set::insert()란?
insert() 함수는 C++ STL에 내장된 함수로, <set> 헤더 파일에 정의되어 있습니다. 이 함수는 set 컨테이너에 요소를 삽입하는 데 사용되며, 요소가 삽입되면 컨테이너의 크기는 삽입된 요소의 개수만큼 증가합니다.
set은 중복 값을 허용하지 않으므로, insert()는 단순히 요소를 넣기만 하는 것이 아니라 삽입하려는 요소가 이미 컨테이너에 존재하는지 먼저 확인합니다. 동일한 값이 이미 있다면 삽입은 무시됩니다. 또한 set의 모든 요소는 항상 정렬된 상태로 유지되기 때문에, 새로 삽입되는 요소 역시 정렬 순서에 맞는 올바른 위치에 자동으로 배치됩니다.
문법(Syntax)
Set1.insert(const type_t &value); ----(1) 또는 Set1.insert(iterator position, const type_t &value); -----(2) 또는 Set1.insert(iterator position_1, iterator position_2); -----(3)
매개변수
value − set 컨테이너에 삽입할 값입니다.
position − 탐색을 시작할 위치를 알려주는 힌트(hint)입니다. 이 위치부터 검색을 시작해 요소가 들어가기에 적합한 자리에 삽입하며, 힌트가 정확하면 삽입 성능이 향상될 수 있습니다.
position_1, position_2 − 삽입할 범위를 지정하는 반복자(iterator)입니다. position_1은 범위의 시작, position_2는 범위의 끝을 나타내며, 두 반복자 사이의 모든 요소가 set에 삽입됩니다.
반환 값
insert() 함수는 전달하는 인자의 형태에 따라 서로 다른 값을 반환합니다.
값만 전달하는 경우 (1): pair<iterator, bool>를 반환합니다. first는 삽입된 요소(또는 이미 존재하던 동일한 요소)를 가리키는 반복자이고, second는 삽입 성공 여부를 나타내는 불리언 값입니다.
위치 힌트와 함께 값을 전달하는 경우 (2): 삽입된 요소를 가리키는 반복자(iterator)를 반환합니다.
position_1과 position_2를 전달하는 경우 (3): 지정된 범위 [position_1, position_2)에 있는 모든 요소를 삽입하며, 별도의 값을 반환하지 않습니다(void).
간단한 예제
입력: set<int> myset;
myset.insert(10);
출력: set에 저장된 값 = 10
입력: set<int> myset = {11, 12, 13, 14};
myset.insert(myset.begin(), 10);
출력: set에 저장된 값 = 10 11 12 13 14
예제 1: 요소를 하나씩 순차적으로 삽입하기
다음 예제는 set에 요소를 차례대로 하나씩 삽입하는 방법을 보여줍니다.
#include <bits/stdc++.h>
using namespace std;
int main(){
set<int> mySet;
mySet.insert(10);
mySet.insert(20);
mySet.insert(30);
mySet.insert(40);
mySet.insert(50);
cout<<"요소들: ";
for (auto i = mySet.begin(); i != mySet.end(); i++)
cout << *i << " ";
return 0;
}
실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다 −
요소들: 10 20 30 40 50
예제 2: 위치 힌트를 활용한 삽입
다음 예제는 삽입 위치를 힌트로 지정하여 요소를 삽입하는 방법을 보여줍니다. 반환된 반복자를 재활용하면 연속적인 삽입 시 성능을 높일 수 있습니다.
#include <bits/stdc++.h>
using namespace std;
int main(){
set<int> mySet;
auto i = mySet.insert(mySet.begin(), 10);
i = mySet.insert(i, 20);
i = mySet.insert(i, 40);
i = mySet.insert(i, 30);
i = mySet.insert(i, 80);
i = mySet.insert(mySet.end(), 90);
cout<<"요소들: ";
for (auto i = mySet.begin(); i != mySet.end(); i++)
cout << *i << " ";
return 0;
}
실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다 −
요소들: 10 20 30 40 80 90
결과에서 볼 수 있듯이, 위치 힌트를 잘못 주더라도 set은 항상 정렬된 순서를 유지합니다. 40 다음에 30을 삽입했음에도 최종 출력은 오름차순으로 깔끔하게 정렬되어 있는 것을 확인할 수 있습니다.