프로그래밍/C,C++
[C/C++] STL Map, Set, Multiset 사용법
노력의천재
2020. 9. 22. 16:39
Map
인덱스로 다양한 자료형을 사용할 수 있음
key-value가 한쌍인 트리 구조 (레드 블랙 트리로 구현되어있음)
key는 중복 허용을 하지 않음
key를 기준으로 정렬된 상태이기 때문에 검색 속도가 빠른 게 장점
key-value를 같이 쓰면서, 검색을 빨리해야 하는 경우 사용
/* STL Map 사용법 */
#include <iostream>
#include <map>
using namespace std;
int main(void) {
map<char, int> M; // Map 선언 <key-value>
map<char, int>::iterator it; // iterator를 통해 Map에 접근
M['A']=3; // key : A - value : 3
M['A']=5; // key는 중복허용이 안된다! 따라서 key 'A'의 value가 5로 갱신
M['B']=2;
M.insert({'C',1}); // key : C - value : 1
M.erase('B'); // key값이 'B'인 원소를 삭제
// M.erase(M.find('B')); 위와 동일
cout<<M.count('A')<<"\n"; // Map에서 key가 'A'인 개수 리턴 : 1
if(!M.empty()) { // 비어있지 않은 경우
cout<<M.size()<<"\n"; // 원소의 개수 리턴 : 2
}
// Map 원소의 처음부터 끝까지 iterator를 통해 탐색
for(it=M.begin(); it!=M.end();it++) {
// it->first : key , it->second : value
cout<<it->first<<" "<<it->second<<"\n";
// A 5 , C 1
}
// key값이 A인 원소를 찾아 value를 리턴
// 존재하지 않을 경우 마지막 원소를 가리키게 설정
if(M.find('A')!=M.end()) {
cout<<"key값이 C인 원소가 존재 : ";
cout<<M.find('A')->second<<"\n"; // key값이 A인 원소를 찾아 value를 리턴 : 5
} else {
cout<<"존재 X";
}
}
Set
Map과 구조가 유사 (key만 있고 value가 없는 Map)
정렬된 집합(중복 값을 허용하지 않고 정렬되어 있음)
특정 값에 대해 검색을 빠르게 해야 하는 경우 사용
/* STL Set 사용법 */
#include <iostream>
#include <vector>
#include <set>
using namespace std;
int main(void) {
set<int> S; // Set 선언
set<int>::iterator it; // iterator를 통해 Set에 접근
S.insert(4);
S.insert(1);
S.insert(2);
vector<int> V;
V.push_back(3);
V.push_back(5);
S.insert(V.begin(),V.end()); // 1 2 3 4 5 (정렬 되는게 특징)
S.erase(4); // key가 4인 원소 제거 : 1 2 3 5
S.erase(S.begin()); // : 처음 key의 원소 제거 : 2 3 5
if(!S.empty()) { // 비어있는지 확인
cout<<S.size()<<"\n"; // Set의 원소 갯수 리턴 : 3
}
// key값이 3인 원소를 찾아 리턴
// 존재하지 않을 경우 마지막 원소를 가리키게 설정
it=S.find(3);
if(it!=S.end()) {
S.erase(it); // key값이 3인 원소를 찾아 삭제
}
// Set 원소의 처음부터 끝까지 iterator를 통해 탐색
for(it=S.begin();it!=S.end();it++) {
cout<<*it<<" ";
// 2 5
}
}
Multiset
중복을 허용하는 Set
#include<bits/stdc++.h>
using namespace std;
multiset<int> ms;
int main() {
ms.insert(12);
ms.insert(10);
ms.insert(10);
ms.insert(10);
ms.insert(8);
ms.insert(5);
ms.insert(30);
ms.insert(50);
for (auto a : ms) {
cout << a << " ";
}
cout << "\n";
auto it1 = ms.find(10);
auto it2 = ms.find(50);
cout << *it1 << " " << *it2 << "\n";
// 원소의 값이 10 부터 50 전까지 삭제
ms.erase(it1, it2);
for (auto it = ms.begin(); it != ms.end(); it++) {
cout << *it << " ";
}
cout << "\n";
}