Map Container정리

이영준·2023년 11월 7일
0

C++ 기본문법

목록 보기
10/10

📌 Map 종류

삽입 순서로 저장되는 Map : Map
순서 없는 Map : Unordered Map

📌 선언

#include <map>
#include <unordered_map>
...
map <int, string> m; // 키가 int형, val이 string 형
unordered_map<string, int> map;

📌 삽입 및 삭제

Map은 Pair을 삽입하여 first가 Key, Second가 Value가 된다. 따라서 make_pair, 혹은 중괄호로{} 묶어 삽입해줄 수 있다.

🔑 insert

m.insert({1, "value"});

주의할 점은 이미 키가 존재하는 경우에는 insert 했을 때 반영이 안된다. 즉 값이 바뀌지 않는다.

🔑 insert 없이 삽입

map<int,int> m;
m[1]++;
m[1] = 3;
map<string,string> m;
m["없는값"]+="무언가합치기";

위와 같이 바로 값을 변경할 수 있다.
insert과 다르게 이미 있는 키의 경우에도 적용되고,
값이 없는 경우에는 python의 defaultdict처럼 default값으로 새로 만들어진다.
int의 경우는 0, string의 경우는 "".

📌 삭제

map.erase(key);

📌 조회

🔑 count로 개수 확인

map.count(key); // map은 하나의 값만 들어가므로 0 혹은 1 반환

🔑 find로 iterator를 통한 조회

map.find(key);
cout << map.find(key)->first; //해당 키의 키 값(즉, 그냥 그 키값)
cout << map.find(key)->second; // 해당 키의 val값
cout << (*map.find(key)).first << "\n";

find 함수를 쓰면 iterator를 반환해준다. iterator는 주소값이므로 해당 주소값의 키값, 혹은 value값은 -> 연산자를 써서 가져온다.
혹은 포인터 연산자로 값을 가져올 수도 있다.

map.end()

find는 존재하지 않는 키를 가져오면 map.end()를 가져온다. 이 map.end()를 통해 map 전체를 순회할 수 있다

cout << (m.find("dfgdfgdfg") == m.end()); // 1

🔑 전체 순회

순회 역시 iterator을 통해 할 수 있다.

for (auto iter = map.begin(); iter != map.end(); iter++) {
    answer *= ((iter)->second + 1);
}

📌 정렬

🔑 value기준 정렬

vector에 map안의 값들을 넣어 정렬한다.
vector를 초기화 할 때 원하는 값의 포인터의 첫번째주소, 마지막주소+1을 넣어서 첫번째~마지막 주소의 값들로 초기화할 수 있다.


static bool comp(pair<char, int>& a, pair<char, int>& b){
	return a.second < b.second;
}

map<char, int> m;
vector<pair<char,  int>> v(m.begin(), m.end());
sort(v.begin(), v.end(), comp);

profile
컴퓨터와 교육 그사이 어딘가

0개의 댓글