unordered_map, map에 대한 부가 설명

말차·2022년 9월 25일

🌼지식🌼

목록 보기
9/10
post-thumbnail

🤯 unordered_map은 입력순으로 저장되지 않는다.

빈도정렬 문제를 풀다가... unordered_map에 대해서 우유부단하게 알고 있다가 멘탈이 털렸다 진짜 탈탈탈...

unorded_map과 map의 차이점은
❶ map은 자동으로 sorted가 되고 unordered_map은 그렇지 않으며
❷ unorded_map은 해시함수를 사용한다
정도로 알고 있었다. 참고로 둘 다 중복을 허용하지 않는다.

여기서 아주 크게 오해한 부분이 unorded_map이 sorted되지 않으니 입력순으로 저장될 것이라고 생각한 부분이다. 근데 순서대로 출력하면 걍 랜덤하게 출력이 된다. 따라서 unordered_map은 입력순으로 저장되지 않는다.
멘탈이 탈탈탈...
이후 이 문제를 푼 다른 분들의 코드를 참조해 보니, map에 대해서 추가로 알 부분이 있었다. 이해라기보단 그냥 그렇구나하고 머리에 넣기로 했다🫠...

🧐 map 초기화 그냥 해도 된다 / 빈도정렬 (백준 1920)

#include <bits/stdc++.h>
using namespace std;
int n, c, num;
map<int, int>   m, order;

bool    cmp(pair<int, int> &a, pair<int, int> &b)
{
    if (a.second == b.second)
        return (order[a.first] < order[b.first]);
    return (a.second > b.second);
}

int main(void)
{
    cin.tie(0);
    ios::sync_with_stdio(0);

    cin >> n >> c;
    for (int i = 0; i < n; i++)
    {
        cin >> num;
        m[num]++; // 0으로 따로 초기화안해도 바로 들어감
        if (order[num] == 0)
            order[num] = i + 1; // 순서 넣는 부분
    }
    vector<pair<int, int>> vec(m.begin(), m.end()); // 자동으로 들어감
    sort(vec.begin(), vec.end(), cmp);
    for (auto a : vec)
        for (int i = 0; i < a.second; i++)
            cout << a.first << ' ';
    return (0);
}

0개의 댓글