[C++] map(맵)의 사용법


Study/C , C++ , MFC  2020. 4. 9. 20:14

안녕하세요. 명월입니다.


이 글은 C++에서 사용되는 map(맵)의 사용법에 대한 글입니다.


이전에 제가 vector에 대해서 설명한 적이 있습니다.

참고 - [C++] vector(리스트)의 사용법 (Stack, Queue 알고리즘 예제)


vector 타입은 동적인 배열같이 값들이 일렬로 배치되어 있어서, 해당 값을 찾으로고 하면 반복문을 사용해서 값을 비교해가며 검색을 해야합니다.

vector의 앞쪽에 해당 데이터가 있다면 빠른 속도로 검색이 되어 결과가 나오겠지만, vector의 뒤쪽에 데이터가 있다면 거의 모든 데이터를 비교하기 떄문에 속도가 느려질 수 있습니다.


그걸 극복하기 위해서 key와 value로 자료 구조를 구성하여 데이터를 검색하는 것입니다.

#include <stdio.h>
#include <iostream>
// map를 사용하기 위해서는 추가한다.
#include <map>
using namespace std;
// 실행 함수
int main()
{
  // map 선언, key와 value 타입을 설정한다.
  map<int, const char*> data1;
  // map은 데이터를 넣기 위해서 make_pair 함수를 이용해서 key와 value를 넣는다.
  data1.insert(make_pair(1, "hello world"));
  data1.insert(make_pair(2, "good"));
  // 키가 2인 데이터의 값를 출력한다.
  cout << "data1.at(2) - " << data1.at(2) << endl;
  // 콘솔 출력
  cout << "data1 iterator result " << endl;
  // iterator형식으로 begin(), end()를 사용해서 포인터를 이용한다.
  for (map<int, const char*>::iterator ptr = data1.begin(); ptr != data1.end(); ptr++) {
    // 콘솔 출력
    cout << "key - " << ptr->first << " value = " << ptr->second << endl;
  }
  // 키가 1인 데이터를 가져와서 값을 출력한다.
  // at은 값을 가져온 것이라면 find는 포인트를 가져온 것이다.
  // first는 키이고 second는 값이다.
  cout << "data1.find(1) - " << data1.find(1)->second << endl;
  // map 선언, key와 value 타입을 설정한다.
  map<const char*, const char*> data2;
  // insert가 아닌 indexer 형식으로도 값을 넣을 수 있다.
  data2["one"] = "a";
  data2["two"] = "b";
  data2["three"] = "b";
  // 콘솔 출력
  cout << "data2 iterator result " << endl;
  // iterator형식으로 포인터를 이용한다.
  // cbegin(), cend()를 사용하면 const 타입으로 값을 수정할 수 없다.
  for (auto ptr = data2.cbegin(); ptr != data2.cend(); ptr++) {
    // 콘솔 출력
    cout << "key - " << ptr->first << " value = " << ptr->second << endl;
  }
  // map 선언, key와 value 타입을 설정한다.
  map<const char*, const char*> data3;
  // insert가 아닌 indexer 형식으로도 값을 넣을 수 있다.
  data3["morning"] = "111";
  // 맵의 아이템 개수
  cout << "data3 count " << data3.size() << endl;
  // data3과 data2의 key와 value 타입이 같으면 바꿔치기 한다.
  // 타입이 다르면 컴파일 에러가 발생한다.
  data3.swap(data2);
  // 콘솔 출력
  cout << "data3 iterator result " << endl;
  // iterator형식으로 포인터를 이용한다.
  // rbegin(), rend()를 사용하면 역순으로 반복한다.
  for (auto ptr = data3.rbegin(); ptr != data3.rend(); ptr++) {
    // 콘솔 출력
    cout << "key - " << ptr->first << " value = " << ptr->second << endl;
  }
  // data3의 키가 two인 데이터를 삭제한다.(메모리 해제는 하지 않는다.)
  data3.erase("two");
  // 콘솔 출력
  cout << "data3 iterator result " << endl;
  // iterator형식으로 포인터를 이용한다.
  // crbegin(), crend()를 사용하면 역순 const 타입이다.
  for (auto ptr = data3.crbegin(); ptr != data3.crend(); ptr++) {
    // 콘솔 출력
    cout << "key - " << ptr->first << " value = " << ptr->second << endl;
  }
  // 맵의 아이템를 전부 제거한다.(메모리 해제를 하지는 것은 아니다.)
  data3.clear();
  // 맵의 비어있는지 확인
  cout << "data 3 empty ? " << (data3.empty() ? "true" : "false") << endl;
  // data3에 값을 넣는다. insert의 경우는 make_pair 함수를 이용하지만 emplace는 key와 value 값으로 입력이 된다.
  data3.emplace("insert", "good");
  // 콘솔 출력
  cout << "key - " << data3.begin()->first << " value = " << data3.begin()->second << endl;

  return 0;
}

map에서 사용되는 함수명이 vector와 상당히 비슷합니다.

함수명 설명
at 데이터를 키로 값을 취득 (indexer로 취득하는 방식과 같습니다.)
find 데이터를 키로 아이템을 취득.. 아이템은 키와 값으로 이루어져 있습니다.
begin
cbegin
iterator를 사용하기 위한 첫번째 pointer
end
cend
iterator를 사용하기 위한 마지막 pointer
rbegin
crbegin
reverse(역방향) iterator를 사용하기 위한 첫번째 pointer
rend
crend
reverse(역방향) iterator를 사용하기 위한 마지막 pointer
empty 맵이 비어있는지 확인합니다.
size 맵의 크기를 반환합니다.
clear 맵의 아이템을 비웁니다.(메모리가 해제되는 건 아닙니다.)
insert, emplace 맵의 아이템를 추가합니다. (insert는 make_pair를 이용해서 맵 아이템을 생성하고 입력하고, emplace는 직접 데이터를 입력합니다.)
erase 맵의 아이템를 삭제합니다.(메모리 해제를 뜻하는 건 아닙니다.)
swap 맵의 아이템을 서로 바꿉니다.

참조 - http://www.cplusplus.com/reference/map/map/


여기까지 C++에서 사용되는 map(맵)의 사용법에 대한 글이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.