C++에서 HashMap(map)을 순회(iteration)하는 동안 특정 값(value)을 기준으로 항목을 제거하는 방법을 알아보겠습니다.
문제 예시
입력: HashMap: { 1: "Mango",
2: "Orange",
3: "Banana",
4: "Apple" }, value="Banana"
출력: HashMap: { 1: "Mango",
2: "Orange",
4: "Apple" }
설명: 세 번째 키-값 쌍이 값 "Banana"를 기준으로 제거되었습니다.
입력: HashMap: { 1: "Yellow",
2: "White",
3: "Green" }, value="White"
출력: HashMap: { 1: "Yellow",
3: "Green" }문제 해결 접근 방식
C++에서는 .erase() 함수를 사용하여 요소를 제거할 수 있습니다. 이 함수는 키(key) 또는 반복자(iterator)를 인자로 받아 해당 요소를 삭제합니다. 이번 튜토리얼에서는 반복자를 사용하여 요소를 제거하는 방법을 다룹니다.
핵심 아이디어는 HashMap을 처음부터 끝까지 순회하면서 각 항목의 값이 목표 값과 일치하는지 검사하고, 일치하는 경우 해당 항목을 제거하는 것입니다.
반복자 무효화 주의 사항
순회 중에 요소를 제거하면 현재 반복자가 무효화(invalidation)될 수 있다는 점에 유의해야 합니다. 따라서 erase() 호출 후에는 반복자를 증가시키지 말고, erase()가 반환하는 다음 요소의 반복자를 사용해야 안전합니다. 아래 코드에서 이 패턴을 확인할 수 있습니다.
구현 예제
위 접근 방식의 C++ 코드
HashMap 순회 중 값으로 요소 제거하기
#include<iostream>
#include<map> // map 연산을 위한 헤더
using namespace std;
int main(){
// HashMap 생성
map< int, string > fruits;
// HashMap에 키-값 쌍 삽입
fruits[1]="Mango";
fruits[2]="Orange";
fruits[3]="Banana";
fruits[4]="Apple";
string value = "Banana";
// 반복자 생성
map<int, string>::iterator it;
// 삭제 전 HashMap 출력
cout<< "HashMap before Deletion:\n";
for (it = fruits.begin(); it!=fruits.end(); ++it)
cout << it->first << "->" << it->second << endl;
// 값이 일치하는 항목을 찾아 제거
for (it = fruits.begin(); it!=fruits.end(); ){
// 현재 값과 목표 값을 비교
if((it->second).compare(value) == 0){
// 요소를 제거하고 다음 반복자를 반환받음
it = fruits.erase(it);
} else {
++it;
}
}
// 삭제 후 HashMap 출력
cout<< "HashMap After Deletion:\n";
for (it = fruits.begin(); it!=fruits.end(); ++it)
cout << it->first << "->" << it->second << endl;
return 0;
}실행 결과
HashMap before Deletion: 1->Mango 2->Orange 3->Banana 4->Apple HashMap After Deletion: 1->Mango 2->Orange 4->Apple
마무리
이번 튜토리얼에서는 C++에서 HashMap을 순회하면서 값으로 항목을 제거하는 방법을 살펴보았습니다. 반복자를 활용해 각 항목의 값을 검사하고, 일치하는 경우 erase() 함수로 안전하게 삭제하는 과정을 예제 코드와 함께 확인했습니다. 이러한 접근 방식은 C뿐만 아니라 Java, Python 등 다른 프로그래밍 언어에서도 유사하게 응용할 수 있습니다. 이 튜토리얼이 도움이 되기를 바랍니다.