ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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";
    }

     

    댓글

Designed by Tistory.