C++ STL의 map은 키(key)와 값(value)을 쌍으로 저장하는 연관 컨테이너입니다. 이 글에서는 map에 저장된 마지막 요소를 삭제하는 방법을 알아보겠습니다.
핵심 아이디어는 간단합니다. prev() 함수를 사용하면 end() 반복자 바로 앞 위치, 즉 마지막 요소를 가리키는 반복자를 얻을 수 있고, 이 반복자를 erase() 함수에 전달하면 해당 요소가 삭제됩니다.
예제 코드
#include<iostream>
#include<map>
using namespace std;
int main() {
map<string, int> my_map;
my_map["first"] = 10;
my_map["second"] = 20;
my_map["third"] = 30;
cout << "마지막 요소 삭제 전 map의 요소:" << endl;
for (auto it = my_map.begin(); it != my_map.end(); it++)
cout << it->first << " ==> " << it->second << endl;
cout << "map에서 마지막 요소를 삭제합니다." << endl;
my_map.erase(prev(my_map.end()));
cout << "마지막 요소 삭제 후 map의 요소:" << endl;
for (auto it = my_map.begin(); it != my_map.end(); it++)
cout << it->first << " ==> " << it->second << endl;
}실행 결과
마지막 요소 삭제 전 map의 요소: first ==> 10 second ==> 20 third ==> 30 map에서 마지막 요소를 삭제합니다. 마지막 요소 삭제 후 map의 요소: first ==> 10 second ==> 20
코드 설명
my_map.end()는 마지막 요소의 '다음' 위치를 가리키기 때문에, 그대로 erase()에 전달할 수 없습니다. 따라서 prev(my_map.end())처럼 prev()를 사용해 반복자를 하나 뒤로 이동시켜 실제 마지막 요소를 가리키도록 해야 합니다. 이렇게 얻은 반복자를 erase()에 넘기면 해당 키-값 쌍이 map에서 제거됩니다.
주의 사항
map이 비어 있으면 end()는 begin()과 같은 위치를 가리키며, 여기에 prev()를 호출하면 정의되지 않은 동작(undefined behavior)이 발생할 수 있습니다. 따라서 삭제 전에 my_map.empty()로 비어 있는지 먼저 확인하는 것이 안전합니다.