본문 바로가기

BackEnd/C랑 C++

C++ std::map을 사용해보자

C 개발을 하다보면 느끼는게 하나 있다

정말,, 자료구조 관리하기 힘들다라는거다 (나만 그럴지도 모른다)

그래서 C++에서 STL이 제공하는 여러 자료구조를 사용하면서 너무 편리했다

 

cf) STL (Standard Template Library)

표준 라이브러리로, std:: namespace를 붙여서 사용하면 된다

 

하지만 한 두개 사용할 수록, 작은거 하나도 헷갈려서 정리하기로 했다

 

- map 정의 방법

- map 요소 삽입

- map 요소 검색

- map 요소 삭제

- map 순회

- map 크기 구하기

 


0. map이 뭔가요?

위키백과: 다수 프로그래밍 언어에서, map은 고차 함수로서 전해진 함수를 배열의 모든 요소에 적용(apply)하여 그 결과 배열을 전달한다.

KEY와 VALUE 형태로 되어있는 자료구조 입니다

삽입할 때는 KEY와 VALUE를 같이 넣어주고

검색이나 순회의 경우에는 KEY를 이용해서 값을 얻어서 사용하곤 합니다

 

1. map 정의 방법

나는 처음 라이브러리를 사용할 때 항상 고민되는게 있다

그래서 어떻게 처음에 써야하는거지? 이 고민을 항상 한다,,

 

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

int main(void)
{
    map<int, string> testMap;

    return 0;
}

 

이렇게만 해주면 이미 다 했다고 볼 수 있다

시작이 반이기 때문이다

 

헤더는 #include <map>을 포함해주면 된다

 

map은 KEY와 VALUE로 이뤄진다는 것을 알고 보면 모양은 알기 쉽다

map<KEY, VALUE>

물구나무하고 봐도 이 모양일테니까 말이다

위의 KEY, VALUE 자리에 key로 쓸 자료형과 value로 쓸 자료형만 넣어주면 끝이다

 

 

2. map 요소 삽입

만든 map에 값을 넣어보자

 

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

int main(void)
{
    map<int, string> testMap;

    /* 1. insert() */
    testMap.insert(pair<int, string>(1, "map1"));

    /* 2. operator[] */
    testMap[2] = "map2";

    return 0;
}

 

map에 값을 넣는 방식은 두 가지 방법이 있다

- insert() 함수를 사용해서 넣기

- operator[] 방식으로 넣기

 

간단하게만 차이를 들자면,

insert()는 map에 요소 추가만 가능하고

operator[] 방식은 추가 및 수정이 둘다 가능하다 

(return 값은 다루지 않겠다)

 

나는 operator[] 방식을 많이 쓴다.

왜냐면 이미 key에 해당하는 값이 있을 때, 최신의 값으로 업데이트를 해주고 싶은데

inser()는 key 값이 중복되면 에러를 뱉는다;; 안 넣어짐!

물론, 상황에 따라 업데이트 되는거가 안 좋을 경우도 있으니까 선택해서 쓰면 된다

 

 

3. map 요소 검색

그러면 넣은 값을 눈으로 확인해보고 싶어진다

 

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

int main(void)
{
    map<int, string> testMap;

    testMap.insert(pair<int, string>(1, "map1"));
    testMap[2] = "map2";

    map<int, string>::iterator iter;
    iter = testMap.find(1);
    if( iter != testMap.end() )
    {
        cout << iter->first << "\n";
        cout << iter->second << "\n";
    }

    return 0;
}

 

뭔가 복잡해보이지만 그렇지 않다

map<int, string>::iterator iter;

여기가 조금 읭 할 수 있는데, iterator는 다음에 자세히 보려고 한다

map을 처음부터 끝까지의 요소에 접근하고 싶어서 사용하는 iterator(반복자) 라고만 알아두자

 

이 반복자가 상당히 재밌는 친구인데, 되게 가시적인? 함수들을 사용할 수 있다

위의 예시에서 쓰고 있는 find()와 end() 함수를 사용하면

C에서 사용하는 for문이나 while문을 사용하지 않고도 요소에 반복해서 접근할 수 있다

 

아래 3가지만 기억해두면 iterator를 몰라도 사용할 수 있다

 

- find() 파라미터에는 찾고자 하는 KEY의 값을 넣어주면 된다

- iterator->first는 map의 KEY 값

- iterator->second는 map의 VALUE 값

 

 

//map<int, string>::iterator iter;
auto iter = testMap.find(1);
if( iter != testMap.end() )
{
   cout << iter->first << "\n";
   cout << iter->second << "\n";
}

 

나는 보통 auto 자료형을 써서 사용한다

auto는 진짜 너무 좋다

 

4. map 요소 삭제

 

삭제 방법은 insert()를 알았다면, 예상하기 쉽다

요소를 erase 해주면 되는거니까, erase()를 사용하면 된다

 

testMap.erase(1);

 

이렇게 말이다. 파라미터에는 KEY 값을 넣어주면 된다

그러면 map에 있는 요소들 중, KEY에 해당하는 요소가 삭제가 된다. KEY도 같이 삭제된다

 

모든걸 다 지우고 싶으면

testMap.clear();

clear() 함수를 쓰면 된다

 

5. map 순회

순회는 역시 처음부터 끝까지 반복자를 통해 봐야할 것 같은 기분이 든다

 

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

int main(void)
{
    map<int, string> testMap;

    testMap.insert(pair<int, string>(1, "map1"));
    testMap[2] = "map2";

    auto iter = testMap.find(1);
    if( iter != testMap.end() )
    {
        cout << iter->first << "\n";
        cout << iter->second << "\n";
    }

    for( iter = testMap.begin(); iter != testMap.end(); iter++ )
    {
        cout << iter->first << "\n";
        cout << iter->second << "\n";
    }

    return 0;
}

 

순회는 for문과 반복자를 사용해서 할 수 있다

 

for( iter = testMap.begin(); iter != testMap.end(); iter++)

begin() 부터 ~~ end() 까지 요소 접근을 하겠다는거다

 

 

6. map 크기 구하기

map의 크기를 알고 싶다면? size를 알고 싶다면?

슬슬 이제 느낌이 온다

 

testMap.size();

 

그렇다.. size() 함수를 써주면 된다

별걸 다 만들어 놓은 것 같다

 


사용방법만 우선 정리하고 싶었는데,

사실 map이니,, set이니,, 리스트니,, 알아야할거가 너무 많다

기본 문법은 한번에 정리하는게 좋을 듯 하다 

귀찮아서 그런거 아님

 

 


위키백과

ko.wikipedia.org/wiki/Map_(%EA%B3%A0%EC%B0%A8_%ED%95%A8%EC%88%98)

 

Map (고차 함수) - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 다수 프로그래밍 언어에서, map은 고차 함수로서 전해진 함수를 배열의 모든 요소에 적용(apply)하여 그 결과 배열을 전달한다. 예를 들어 만약 다음과 같은 함수

ko.wikipedia.org