프로그래밍/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";
}