본문 바로가기
프로그래밍/C&C++

[C/C++]C++ map이란? map 선언 및 설명 예제코드

by wyatti 2023. 4. 20.

 

c++ map
c++ map 사용법

C++ map이란?

c++에서 map은 STL(Standard Template Library)에 포함된 자료구조 중 하나이며, "key-value" 쌍으로 이루어진 자료구조입니다. 이때, key는 중복되지 않고 유일한 값이어야 합니다. 이러한 key-value 쌍은 빠른 검색을 위한 구조로 사용됩니다. map은 C++11부터 unordered_map과 함께 해시 테이블을 구현하기 위한 자료구조 중 하나입니다.

 

map의 선언

map은 C++ 표준 라이브러리에 정의되어 있으므로 추가적인 헤더 파일 포함이 필요합니다.

#include <map>

 

map은 템플릿으로 정의되어 있으며, 키와 값의 자료형을 명시해주어야 합니다. 예를 들어, int형 key와 string형 value를 가지는 map을 선언하고 싶다면 다음과 같이 작성합니다.

std::map<int, std::string> myMap;

 

 

map에 key-value  추가

map에 key-value 쌍을 추가하기 위해서는 다음과 같이 insert() 함수를 사용합니다.

myMap.insert(std::make_pair(1, "apple"));

위 코드는 key 값으로 1, value 값으로 "apple"을 가지는 쌍을 map에 추가합니다. 만약 이미 존재하는 key 값에 대해 insert() 함수를 호출하면, 새로운 key-value 쌍이 추가되지 않고 이전에 존재하는 value 값이 반환됩니다.

map에서 key-value 삭제

map에서 key-value을 삭제하기 위해서는 erase() 함수를 사용합니다. erase() 함수는 key 값을 파라미터로 받으며, 해당 key 값을 가지는 쌍이 map에서 삭제됩니다.

myMap.erase(1);

위 코드는 key 값으로 1을 가지는 쌍을 map에서 삭제합니다.

 

map에서 value 값 참조

map에서 key 값을 사용하여 value 값을 참조하기 위해서는 [] 연산자를 사용합니다.

std::string myValue = myMap[1];

위 코드는 key 값으로 1을 가지는 쌍의 value 값을 myValue 변수에 대입합니다. 하지만, 만약 존재하지 않는 key 값을 사용하여 [] 연산자를 호출하면, 새로운 key-value 쌍이 추가되며, value 값은 해당 자료형의 기본값으로 초기화됩니다.

 

map에서 key 존재 여부 확인

map에서 특정 key 값이 존재하는지 여부를 확인하기 위해서는 find() 함수를 사용합니다. find() 함수는 key 값을 파라미터로 받으며, 해당 key 값을 가지는 쌍의 iterator를 반환합니다. 만약 존재하지 않는 key 값을 사용하여 find() 함수를 호출하면, map의 end() iterator를 반환합니다.

따라서, key 값의 존재 여부를 확인하려면 반환된 iterator와 end() iterator를 비교하여 확인해야 합니다.

auto iter = myMap.find(1);

if (iter != myMap.end()) {
  // key 값이 존재하는 경우
} else {
  // key 값이 존재하지 않는 경우
}

위 코드는 key 값으로 1을 가지는 쌍의 iterator를 반환하여 iter 변수에 저장합니다. 이후, iter와 end() iterator를 비교하여 key 값의 존재 여부를 확인합니다.

map 순회하기

map의 모든 key-value 쌍에 대해 순회하기 위해서는 iterator를 사용합니다. iterator는 map의 begin() 함수와 end() 함수로부터 얻어올 수 있습니다. 다음은 map의 모든 key-value 쌍을 출력하는 예제 코드입니다.

for (auto iter = myMap.begin(); iter != myMap.end(); ++iter) {
  std::cout << "Key: " << iter->first << ", Value: " << iter->second << std::endl;
}

위 코드는 map의 begin() 함수로부터 시작하는 iterator를 생성하고, end() 함수로부터 얻어온 iterator와 비교하여 모든 key-value 쌍을 출력합니다.

이상으로 map의 기본적인 사용 방법에 대해 설명해 드렸습니다. map은 key-value 쌍을 빠르게 검색하고 저장하는데 적합한 자료구조입니다. 하지만, unordered_map과 같이 해시 테이블을 사용하는 자료구조와 비교하면 검색 속도가 느리다는 단점이 있습니다. 따라서, 사용 목적에 따라 적절한 자료구조를 선택하여 사용해야 합니다.

 

map예제

예제 코드를 통해 map을 더 자세히 살펴보겠습니다.

#include <iostream>
#include <map>

int main() {
  // int를 key로, string을 value로 가지는 map 생성
  std::map<int, std::string> myMap;

  // map에 key-value 쌍 추가
  myMap.insert(std::make_pair(1, "apple"));
  myMap.insert(std::make_pair(2, "banana"));
  myMap.insert(std::make_pair(3, "cherry"));

  // map 크기 출력
  std::cout << "Map size: " << myMap.size() << std::endl;

  // key 값으로 map 검색하기
  auto iter = myMap.find(2);

  if (iter != myMap.end()) {
    std::cout << "Key: " << iter->first << ", Value: " << iter->second << std::endl;
  } else {
    std::cout << "Key not found." << std::endl;
  }

  // map 순회하기
  for (auto iter = myMap.begin(); iter != myMap.end(); ++iter) {
    std::cout << "Key: " << iter->first << ", Value: " << iter->second << std::endl;
  }

  return 0;
}

 

위 코드에서는 std::map<int, std::string> 자료형을 사용하여 myMap 변수를 생성합니다. 이후 myMap.insert() 함수를 사용하여 key-value 쌍을 추가합니다. myMap.size() 함수를 사용하여 map의 크기를 출력하고, myMap.find() 함수를 사용하여 key 값으로 검색합니다. 검색 결과에 따라 적절한 메시지를 출력합니다. 마지막으로, for 루프를 사용하여 모든 key-value 쌍을 출력합니다.

댓글