이 글에서는 C++ STL의 set::emplace_hint() 함수에 대해 개념, 구문, 동작 방식, 그리고 반환값까지 자세히 살펴보겠습니다.
C++ STL에서 set란 무엇인가?
C++ STL에서 set은 고유한(unique) 요소들을 정렬된 순서로 저장하는 컨테이너입니다. 각 요소의 값 자체가 곧 식별자 역할을 하기 때문에 중복된 값을 가질 수 없습니다. 한 번 set에 삽입된 값은 이후 수정할 수 없지만, 요소를 추가하거나 제거하는 것은 언제든 가능합니다. 내부적으로 set은 이진 탐색 트리(binary search tree) 구조로 구현되어 있어 빠른 검색 성능을 제공합니다.
set::emplace_hint()란?
emplace_hint()는 C++ STL에 내장된 함수로, <set> 헤더 파일에 정의되어 있습니다. 이 함수는 위치 힌트(hint)와 함께 새 요소를 set 컨테이너에 삽입합니다. 삽입하려는 값과 동일한 값이 컨테이너에 존재하지 않을 경우에만 실제로 삽입이 이루어집니다. 함수는 힌트로 전달된 위치부터 탐색을 시작하여 요소가 삽입될 최적의 위치를 찾아냅니다.
구문
Set1.emplace_hint(iterator position, const type_t& value);
매개변수
이 함수는 두 개의 매개변수를 받습니다. 하나는 힌트 위치이고, 다른 하나는 삽입할 요소입니다.
position − 탐색이 시작되는 힌트 위치입니다. 이 위치는 함수의 실행 속도를 높이기 위한 참고 사항일 뿐, 요소가 실제로 삽입될 위치를 강제로 지정하지 않습니다.
value − 실제로 삽입하고자 하는 값입니다.
반환값
삽입이 성공적으로 이루어지면, 새로 삽입된 요소를 가리키는 반복자(iterator)를 반환합니다.
예제 1: 기본 사용법
Input: set mySet; mySet.emplace_hint(mySet.begin(), 0); mySet.emplace_hint(i, 1); mySet.emplace_hint(i, 2); mySet.emplace_hint(i, 1); Output: Elements are : 0 1 2
예제 2: 정수형 set 활용
#include <bits/stdc++.h>
using namespace std;
int main(){
set<int> mySet;
auto i = mySet.emplace_hint(mySet.begin(), 0);
i = mySet.emplace_hint(i, 1);
mySet.emplace_hint(i, 2);
mySet.emplace_hint(i, 1);
cout<<"elements are : ";
for (auto i = mySet.begin(); i != mySet.end(); i++)
cout << *i<< " ";
return 0;
}출력 결과
위 코드를 실행하면 다음과 같은 출력이 생성됩니다 −
Elements are : 0 1 2
위 예제에서 주목할 점은 마지막 줄에서 이미 존재하는 값 1을 다시 삽입하려 했지만, set은 중복을 허용하지 않으므로 최종 출력에는 나타나지 않는다는 것입니다.
예제 3: 문자열 set 활용
#include <iostream>
#include <set>
#include <string>
int main (){
std::set<std::string> mySet;
auto i = mySet.cbegin();
mySet.emplace_hint (i,"best");
i = mySet.emplace_hint (mySet.cend(),"point");
i = mySet.emplace_hint (i,"is the");
i = mySet.emplace_hint (i,"tutorials");
std::cout<<"string is : ";
for(const std::string& str: mySet)
std::cout << ' ' << str;
std::cout << '
';
return 0;
}출력 결과
위 코드를 실행하면 다음과 같은 출력이 생성됩니다 −
String is : best is the point tutorials
문자열 set의 경우에도 힌트 위치와 관계없이 요소들은 항상 정렬된 순서(사전순)로 유지됩니다. 힌트는 단지 삽입 연산의 효율성을 높이는 데 사용될 뿐입니다.