-
[C/C++] STL Map, Set, Multiset 사용법프로그래밍/C,C++ 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"; }
'프로그래밍 > C,C++' 카테고리의 다른 글
[C/C++] lower_bound, upper_bound, binary_search 사용법 (0) 2021.01.15 [C/C++] StringStream 사용법 (문자열 나누기) (0) 2020.11.14 [C/C++] STL Stack, Queue 사용법 (0) 2020.09.22 [C/C++] map 자료구조를 이용한 문자열 문제 해결 (0) 2020.09.02 [C/C++] STL Vector 사용법 (0) 2020.05.08