map, 맵
맵은 앞서 보았던 set과 거의 동일한 자료 구조다. 다만 차이점이 있다면 set은 key값만 저장하였고, map의 경우 key와 value로 구성되어 저장된다. 한마디로 key와 value 한 쌍을 이루어 자료를 보관할 수 있다.
그림은 추상적으로 map의 자료형태를 나타낸 것이다. 실제로 set과 동일하게 트리구조형태로 정렬되어 저장된다.
#include<iostream>
#include<map>
using namespace std;
int main() {
map<int, string> name;
name.insert(pair<int, string>(4, "kim"));
name.insert(pair<int, string>(1, "kim"));
name.insert(pair<int, string>(3, "lee"));
name.insert(pair<int, string>(5, "park"));
name.insert(pair<int, string>(4, "kim"));
name[2] = "choi";
map<int, string>::iterator it;
for(it = name.begin(); it != name.end(); it++){
cout << "key : " << (*it).first << " value : " << (*it).second << endl;
}
return 0;
}
결과값)
key : 1 value : kim
key : 2 value : choi
key : 3 value : lee
key : 4 value : kim
key : 5 value : park
셋과 동일하게 key값을 기준으로 정렬되어 삽입이 이루어진다. 또한, key는 중복값을 허용하지 않는다. 반면 value의 경우 중복 값이 허용된다. 또한, 값을 쌍으로 삽입을 하기 때문에 insert 함수 내에서 pair를 활용하는 것이 특징이다.
map.at(key)
|
지정된 키 값이 있는 요소를 찾는다.
|
map.begin()
|
map의 첫 번째 요소를 가리키는 반복자를 반환.
|
map.clear()
|
map의 모든 요소를 지운다.
|
size_type = map.count(key)
|
키가 매개 변수에서 지정한 키와 일치하는 map의 요소 수를 반환.
|
pair = map.emplace(key, value)
|
map에 생성된 요소를 삽입.
|
iter = map.emplace_hint(iter, key,value)
|
배치 힌트를 사용하여 map에 생성된 요소를 삽입.
|
map.empty()
|
Map이 비어 있으면 true 를 반환.
|
map.begin()
|
마지막 바로 다음 반복기를 반환.
|
pair = map.equal_range(key)
|
반복자 쌍을 반환.
map에서 지정된 키보다 큰 키가 있는 첫 번째 요소를 가리키는 쌍의 첫 번째 반복자
map에서 키보다 크거나 같은 키가 있는 첫 번째 요소를 가리키는 쌍의 두 번째 반복자
|
map.erase(iter)
map.erase(iter_beign, iter_end)
size = map.erase(key)
|
지정된 위치의 map에서 요소 또는 요소 범위를 제거.
|
iter = map.find(key)
|
map에서 지정된 키와 같은 키를 가진 요소의 위치를 가리키는 반복자를 반환.
|
map.insert({key, value})
map.insert(make_pair(key,value))
map.insert(iter, make_pair(key, value))
map.insert(iter_begin, iter_end)
|
요소 또는 요소의 범위를 map의 지정된 위치에 삽입.
|
key_compare = map.key_comp()
|
map에서 순서 키로 사용되는 비교 개체의 복사본을 반환.
|
iter = map.lower_bound(key)
|
map에서 지정된 키보다 같거나 큰 키 값을 가진 첫 번째 요소에 반복자를 반환.
|
map.max_size()
|
map의 최대 길이를 반환.
|
map.size()
|
map에 있는 요소 수를 반환.
|
map.swap(map2)
|
두 map의 요소를 교환.
|
iter = map.upper_bound(key)
|
map에서 지정된 키보다 큰 키 값을 가진 첫 번째 요소에 반복자를 반환.
|
value_compare = map.value_comp()
|
map에서 요소 값의 정렬에 사용되는 비교 개체의 복사본을 검색.
|
#include<iostream>
#include<map>
using namespace std;
int main()
{
map<int, string> spurs;
map<int, string> city;
spurs.insert(make_pair(1, "Hugo Lloris"));
spurs.insert(make_pair(3, "Danny Rose"));
spurs.insert(make_pair(4, "Toby Alderweireld"));
spurs.insert(make_pair(7, "Son Heung-min"));
spurs.insert(make_pair(10, "Harry Kane"));
spurs.insert(make_pair(20, "Dele Alli"));
spurs.insert(make_pair(23, "Christian Eriksen"));
city.insert(make_pair(31, "Ederson Moraes"));
city.insert(make_pair(2, "Kyle Walker"));
city.insert(make_pair(14, "Aymeric Laporte"));
city.insert(make_pair(7, "Raheem Sterling"));
city.insert(make_pair(17, "Kevin De Bruyne"));
city.insert(make_pair(20, "Bernardo Silva"));
city.insert(make_pair(10, "Sergio Agüero"));
cout << "Tottenham vs Manchester City" << endl;
map<int, string> spursMatch;
map<int, string> cityMatch;
map<int, string>::iterator si;
map<int, string>::iterator ci;
si = spurs.find(1);
ci = city.find(1);
if(si != spurs.end()){
spursMatch[(*si).first] = (*si).second;
spurs.erase(1);
}
if(ci != city.end()){
cityMatch[(*ci).first] = (*ci).second;
city.erase(1);
}else {
ci = city.find(31);
if(ci != city.end()){
cityMatch[(*ci).first] = (*ci).second;
city.erase(31);
}
}
si = spurs.lower_bound(2);
ci = city.lower_bound(2);
spursMatch[(*si).first] = (*si).second;
cityMatch[(*ci).first] = (*ci).second;
spurs.erase((*si).first);
city.erase((*ci).first);
auto i_pair = spurs.equal_range(10);
i_pair.first--;
i_pair.second++;
for(si = i_pair.first; si != i_pair.second; si++) {
spursMatch[si->first] = si->second;
}
spurs.erase(i_pair.first, i_pair.second);
i_pair = city.equal_range(10);
i_pair.first--;
i_pair.second++;
for(ci = i_pair.first; ci != i_pair.second; ci++) {
cityMatch[ci->first] = ci->second;
}
city.erase(i_pair.first, i_pair.second);
cout << "선발 명단 Tottenham" << endl;
for(si = spursMatch.begin(); si != spursMatch.end(); si++){
cout << (*si).first << " " << (*si).second << endl;
}
cout << "대기명단 Tottenham" << endl;
for(si = spurs.begin(); si != spurs.end(); si++){
cout << (*si).first << " " << (*si).second << endl;
}
cout << "선발 명단 Manchester City" << endl;
for(ci = cityMatch.begin(); ci != cityMatch.end(); ci++){
cout << (*ci).first << " " << (*ci).second << endl;
}
cout << "대기명단 Manchester City" << endl;
for(ci = city.begin(); ci != city.end(); ci++){
cout << (*ci).first << " " << (*ci).second << endl;
}
return 0;
}
결과값)
Tottenham vs Manchester City
선발 명단 Tottenham
1 Hugo Lloris
3 Danny Rose
7 Son Heung-min
10 Harry Kane
20 Dele Alli
대기명단 Tottenham
4 Toby Alderweireld
23 Christian Eriksen
선발 명단 Manchester City
2 Kyle Walker
7 Raheem Sterling
10 Sergio Agüero
14 Aymeric Laporte
31 Ederson Moraes
대기명단 Manchester City
17 Kevin De Bruyne
20 Bernardo Silva
multimap, 멀티맵
멀티맵도 멀티셋과 같이 key에 대한 중복을 허용하는 컨테이너다. 다만 map의 특성을 똑같이 갖고 있고 key의 중복만 허용한다는 점이 다르다.
C++, STL 연관컨테이너(associative container), map, multimap : 네이버 블로그 (naver.com)
'CS > 자료구조 & 알고리즘' 카테고리의 다른 글
C++ 프림(Prim) 알고리즘으로 MST 찾기 (0) | 2023.08.12 |
---|---|
[C++] STL 연관 컨테이너(associative container), set, multiset (0) | 2023.08.11 |
[C++] STL list(리스트), 시퀀스 컨테이너 (0) | 2023.08.11 |
Union-Find (합집합 찾기) 알고리즘 (0) | 2022.12.19 |
라빈-카프 알고리즘 (Rabin-Karp) 해시값을 통한 문자열 비교 (0) | 2022.12.02 |