C++ 프로그래밍에서 STL set(집합) 컨테이너에 여러 요소가 저장되어 있다고 가정해 보겠습니다. 이때 set에서 마지막 요소를 삭제해야 하는 경우가 종종 발생합니다.
예를 들어 [10, 41, 54, 20, 23, 69, 84, 75]라는 값을 set에 삽입하면, set은 내부적으로 자동 정렬되기 때문에 [10 20 23 41 54 69 75 84] 순서로 저장되며, 마지막 요소는 84가 됩니다. 이번 글에서는 C++ 코드를 사용해 set의 마지막 요소를 삭제하는 방법을 알아보겠습니다.
핵심 개념
std::set은 레드-블랙 트리 기반의 연관 컨테이너로, 모든 요소가 항상 오름차순으로 정렬된 상태로 유지됩니다. 따라서 마지막 요소는 end() 반복자 바로 앞 위치에 존재합니다. C++11부터 제공되는 prev() 함수를 사용하면 end() 앞의 반복자를 손쉽게 구할 수 있고, 이 반복자를 erase() 함수에 전달하면 해당 요소를 안전하게 삭제할 수 있습니다.
예제 코드
#include<iostream>
#include<set>
using namespace std;
void display(set<int> my_set){
for (auto it = my_set.begin(); it != my_set.end(); ++it)
cout << *it << " ";
}
int main() {
int arr[] = {10, 41, 54, 20, 23, 69, 84, 75};
int n = sizeof(arr)/sizeof(arr[0]);
set<int> my_set;
for(int i = 0; i<n; i++){
my_set.insert(arr[i]);
}
cout << "삭제 전 set: ";
display(my_set);
set<int>::iterator it;
it = prev(my_set.end());
my_set.erase(it);
cout << "\n삭제 후 set: ";
display(my_set);
}실행 결과
삭제 전 set: 10 20 23 41 54 69 75 84 삭제 후 set: 10 20 23 41 54 69 75
코드 설명
- 배열의 요소들을
insert()함수로 set에 삽입합니다. 삽입 과정에서 중복된 값은 자동으로 제거되고, 요소들은 항상 정렬된 상태를 유지합니다. prev(my_set.end())를 호출하여 마지막 요소를 가리키는 반복자를 얻습니다.end()는 마지막 요소의 다음 위치를 가리키므로prev()로 한 칸 앞으로 이동해야 합니다.erase(it)를 호출하여 해당 반복자가 가리키는 요소, 즉 마지막 요소인 84를 삭제합니다.
이처럼 prev()와 erase()를 조합하면 set의 마지막 요소를 간단하고 안전하게 삭제할 수 있습니다. 다만 set이 비어 있는 상태에서 prev(end())를 호출하면 정의되지 않은 동작(undefined behavior)이 발생할 수 있으므로, 실제 코드에서는 empty() 검사를 함께 수행하는 것이 좋습니다.