멈추지 않고 끈질기게
[C++][메모용] map 관련 정리 본문
※ 해당 포스팅은 개인의 공부 정리용 글입니다. 틀린 내용이 있다면 추후 수정될 수 있습니다.
※ 해당 포스팅은 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;
}
- 경우에 따라 편리하기도 하지만, 탐색을 하는 경우 없는 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. 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. 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";
}
'C++' 카테고리의 다른 글
[C++][메모] 옛날 문법 정리 (1) | 2024.11.03 |
---|---|
[C++][메모용] reserve() vs resize() / 시간 측정(std::chrono) (0) | 2024.10.17 |
[C++] std::endl vs "\n" (2) | 2024.07.23 |
[C++] 람다 표현식(lambda expression) (0) | 2023.12.05 |
[C++] 스마트 포인터(Smart Pointer) (0) | 2023.11.23 |