멈추지 않고 끈질기게

[C++][메모용] map 관련 정리 본문

C++

[C++][메모용] map 관련 정리

sam0308 2024. 8. 1. 10:15

※ 해당 포스팅은 개인의 공부 정리용 글입니다. 틀린 내용이 있다면 추후 수정될 수 있습니다.

 

※ 해당 포스팅은 C++ 17 버전을 기준으로 작성되었습니다.

 

 

 

1. map은 존재하지 않는 key를 통해 접근하면 데이터가 만들어진다

 - map은 인덱서에 key를 넣어 해당 key에 맞는 value를 가져올 수 있음

 - 이 때, 존재하지 않는 key를 넣으면 value 자료형의 기본값으로 데이터가 만들어짐

#include <iostream>
#include <map>

using namespace std;

int main()
{
    map<string, int> m;
    m["test_1"] += 3;

    cout << m["test_1"] << endl;
    cout << m["test_2"] << endl;
}

사진 1. 존재하지 않는 key 접근

 

 

 - 경우에 따라 편리하기도 하지만, 탐색을 하는 경우 없는 key를 넣어서 탐색이 꼬이는 경우가 종종 있음

   → 해당 key가 존재하는지 검색하려면 find() 함수를 사용하자

#include <iostream>
#include <map>

using namespace std;

int main()
{
    map<string, int> m;
    m.insert(pair<string, int>{"test", 5});

    if (m.find("test") != m.end())
        cout << m["test"] << endl;
    else
        cout << "There is no key: " << "test" << endl;

    if (m.find("empty") != m.end())
        cout << m["empty"] << endl;
    else
        cout << "There is no key: " << "empty" << endl;
}

사진 2. find()를 이용한 key 검색

 

 

 

2. map은 기본적으로 key 기준 오름차순 정렬

 - map은 기본적으로 key를 기준으로 오름차순으로 정렬됨

 - key 기준으로 내림차순으로 정렬하려면 greater<T>를 선언에 추가하여 가능

#include <iostream>
#include <string>
#include <map>

using namespace std;

int main()
{
    map<int, string> m1; // 오름차순
    map<int, string, greater<int>> m2; // 내림차순

    for(int i = 0; i < 4; ++i)
    {
        m1.insert(pair<int, string>{i, "data_" + to_string(i)});
        m2.insert(pair<int, string>{i, "data_" + to_string(i)});
    }

    cout << "m1 데이터(오름차순)" << "\n";
    for (auto it = m1.begin(); it != m1.end(); ++it)
        cout << it->second << "\n";

    cout << "\n";
    cout << "m2 데이터(내림차순)" << "\n";
    for (auto it = m2.begin(); it != m2.end(); ++it)
        cout << it->second << "\n";
}

사진 3. key 기준 오름차순 & 내림차순

 

 

 

3. value 기준으로 정렬하려면 vector로 복사하자

 - map에서는 value 기준으로 정렬하는 기능은 제공하지 않음

 - 단, 동일한 자료형의 vector로 한번 복사한 다음 정렬해주면 가능함

   (map의 원소는 pair<T, T> 이므로 vector<pair<T, T>>의 형태가 됨)

 - sort() 함수를 사용하되, 3번째 인자로 정렬 기준을 함수 혹은 람다식으로 전달하여 value 기준 정렬 구현 

#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
    map<string, int> m;
	m.insert(pair<string, int>{"data_5", 1});
    m.insert(pair<string, int>{"data_7", 2});
    m.insert(pair<string, int>{"data_3", 3});
    m.insert(pair<string, int>{"data_6", 4});

    vector<pair<string, int>> vec(m.begin(), m.end());
    sort(vec.begin(), vec.end(), [](pair<string, int> a, pair<string, int> b)
    {
        return a.second > b.second; // value 기준 내림차순
    });

    for(const pair<string, int>& p : vec)
        cout << "key: " << p.first << " | value: " << p.second << "\n";
}

사진 4. value 기준 내림차순 정렬