Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ map과 unordered_map에서 특정 키 존재 여부 확인하기

C++에서 mapunordered_map은 키(key)와 그에 대응하는 값(value)을 저장하는 연관 컨테이너입니다. 이 두 컨테이너는 내부적으로 정렬된 트리(map) 또는 해시 테이블(unordered_map) 구조를 사용하여 데이터를 관리합니다.

실무 개발에서는 특정 키가 컨테이너에 이미 존재하는지 확인해야 하는 경우가 자주 발생합니다. 예를 들어, 중복 삽입을 방지하거나 키가 없을 때만 값을 초기화하고 싶을 때가 대표적입니다. 이번 글에서는 주어진 키가 맵에 존재하는지 확인하는 방법을 알아보겠습니다.

find() 함수로 키 존재 여부 확인

키의 존재 여부를 확인하는 가장 일반적인 방법은 find() 함수를 사용하는 것입니다. find()는 해당 키를 찾으면 그 요소를 가리키는 반복자(iterator)를 반환하고, 찾지 못하면 end() 반복자를 반환합니다. 따라서 반환된 반복자가 end()와 같은지 비교하면 키의 존재 여부를 판단할 수 있습니다.

예제 코드

#include<iostream>
#include<map>
using namespace std;

string isPresent(map<string, int> m, string key) {
    if (m.find(key) == m.end())
        return "Not Present";   // 키가 존재하지 않음
    return "Present";           // 키가 존재함
}

int main() {
    map<string, int> my_map;
    my_map["first"] = 4;
    my_map["second"] = 6;
    my_map["third"] = 6;

    string check1 = "fifth", check2 = "third";
    cout << check1 << ": " << isPresent(my_map, check1) << endl;
    cout << check2 << ": " << isPresent(my_map, check2);
}

실행 결과

fifth: Not Present
third: Present

count() 함수를 사용한 대안

find() 외에도 count() 함수를 활용할 수 있습니다. 맵의 각 키는 고유하므로 count(key)는 키가 존재하면 1, 존재하지 않으면 0을 반환합니다. 코드가 더 간결해지는 장점이 있습니다.

if (my_map.count("third") > 0) {
    // 키가 존재하는 경우의 처리
}

C++20의 contains() 함수

C++20부터는 의도를 더 명확하게 드러내는 contains() 함수를 사용할 수 있습니다. 불리언 값을 직접 반환하므로 가독성이 뛰어나며, 가능하다면 이 방법을 사용하는 것이 좋습니다.

if (my_map.contains("third")) {
    // 키가 존재하는 경우의 처리
}

주의 사항: operator[] 사용 금지

키 존재 여부를 확인할 때 my_map[key]처럼 operator[]를 사용해서는 안 됩니다. 해당 키가 없을 경우 새로운 키-값 쌍(기본값으로 초기화됨)이 맵에 추가되어 버리기 때문입니다. 단순 조회 목적이라면 반드시 find(), count(), 또는 contains()를 사용해야 합니다.

정리

  • find(): C++98부터 사용 가능한 표준적인 방법. 반복자를 반환하므로 값 접근도 동시에 가능
  • count(): 코드가 간결하지만, 키가 있을 때 값을 다시 찾아야 할 수 있음
  • contains(): C++20 이상에서 권장되는 가장 명확한 방법

세 가지 방법 모두 mapunordered_map에서 동일하게 동작하므로, 프로젝트의 C++ 표준 버전과 상황에 맞게 선택하면 됩니다.