2019년 11월 4일 월요일

std::map 활용법

<std::map> 활용법​

오늘 포스팅 할 내용은 C++ 에서 주로 쓰이는 STL (Stand Template Library) 중 map 활용법에 대한 강좌 입니다.

map 는 STL 에서 제공하는 key/value 성 데이터를 관리의 목적으로 만들어진 Template Class 중 하나 입니다.

map<Key, Value> variable; 과 같이 선언 하여 씁니다.

간단히 문자열 "A" ~ "Z" 까지 실제 ASCII 코드값을 매칭 하는 샘플을 만들어 보겠습니다.


#include <stdio.h>
#include <string>
#include <map>

int main()
{
 std::map<std::string, int> mapAlphaASCII;

 //값 할당.
 for (int i = 65; i <= 90; i++)
 {
  std::string sKey;
  sKey.resize(2);

  sprintf((char*)sKey.c_str(), "%c", i);

  mapAlphaASCII.insert(std::map<std::string, int>::value_type(sKey, i));
 }


 //값 출력..
 std::map<std::string, int>::iterator iteLoop;

 for (iteLoop = mapAlphaASCII.begin(); iteLoop != mapAlphaASCII.end(); iteLoop++)
 {
  printf("key[%s] value[%d]\n", iteLoop->first.c_str(), iteLoop->second);
 }

 return 0;
}
< 위 코드는 우분투 환경에서 g++ 9.2.1 에서 빌드 되었습니다 >

​코드는 중복값 체크 없이 무조건 삽입 하는 코드 입니다. 기본적으로 iterator 를 이용하여 멤버 접근 하는 방법으로 처리 하였으나 operator[] 를 이용하여 키를 직접 접근도 가능합니다.

map 관련 상세한 인터페이스는 http://www.cplusplus.com/reference/map/map/ 여기서 확인 하실수 있습니다.

제가 여기서 추가로 설명하고자 하는것은 제가 자주 사용하던 패턴과 사용함에 있어 필요로 생각하는 요소들만 정리해서 안내 해드리겠습니다.

a. insert : map 에 멤버를 추가 해주는 메소드 입니다.
b. size : map 에 저장된 멤버에 대한 갯수를 리턴해주는 메소드 입니다.
c. clear : map 에 저장된 멤버를 모두 지우는 메소드 입니다.
d. erase : map 에 저장된 멤버중 하나 또는 그 이상을 지우는 메소드 입니다.
e. begin : iterator 를 이용하는 방식을 이용할때 맨 처음에 지시하는 멤버를 리턴합니다.
f. end : iterator 를 이용하는 방식을 이용할때 맨 마지막에 지시하는 멤버를 리턴합니다.
g. find : 특정 키에 해당하는 값을 iterator 값으로 리턴합니다.

위 설명된 항목들을 활용한 샘플 코드를 만들어 보겠습니다.


#include <stdio.h>
#include <string>
#include <map>

int main()
{
 std::map<std::string, int> mapAlphaASCII;

 //값 할당.
 for (int i = 65; i <= 90; i++)
 {
  std::string sKey;
  sKey.resize(2);

  sprintf((char*)sKey.c_str(), "%c", i);

  mapAlphaASCII.insert(std::map<std::string, int>::value_type(sKey, i));
 }

 printf("mapAlphaASCII Member Count %d\n", (int)mapAlphaASCII.size());

 //operator [] 값 출력.
 for (int i = 65; i < (65+mapAlphaASCII.size()); i++)
 {
  std::string sKey;
  sKey.resize(2);

  sprintf((char*)sKey.c_str(), "%c", i);

  printf("operator key[%s] value[%d]\n", sKey.c_str(), mapAlphaASCII[sKey]);
 }

 //iterator 값 출력..
 std::map<std::string, int>::iterator iteLoop;

 for (iteLoop = mapAlphaASCII.begin(); iteLoop != mapAlphaASCII.end(); iteLoop++)
 {
  printf("iterator key[%s] value[%d]\n", iteLoop->first.c_str(), iteLoop->second);
 }

 // B 값을 찾아 삭제.
 std::map<std::string, int>::iterator iteDelB;

 std::string sKeyB;
 sKeyB.resize(2);
 sprintf((char*)sKeyB.c_str(), "B"); 
 iteDelB = mapAlphaASCII.find(sKeyB);

 if (iteDelB != mapAlphaASCII.end())
 {
  mapAlphaASCII.erase(iteDelB);
 }
 else
  printf("Not Found B\n");

 printf("mapAlphaASCII Member Count %d\n", (int)mapAlphaASCII.size());

 //전체 멤버 삭제.
    mapAlphaASCII.clear();
    // 또는 mapAlphaASCII.erase(mapAlphaASCII.begin(), mapAlphaASCII.end());

    printf("mapAlphaASCII Member Count: %d\n", (int)mapAlphaASCII.size());

 return 0;
}

map 의 기능은 제가 링크를 걸은 곳에서 더 많은 기능을 확인 하실수 있습니다.

댓글 없음: