c++/STL

map & set

길자 2025. 11. 28. 10:29
반응형
vector,list,deque 컨테이너는 시퀀스 컨테이너라 하며 순서가 있는 것을 의미하낟.
map/set 검색과 중복 방지에 특화된 연관 컨테이너로 노드기반, 균형 이진 트리를 사용한다.
레드-블랙 트리로 구현되어 있다.

 

 

레드-블랙 트리 (Red-Black Tree)

트리가 자동으로 균형을 유지하도록 고안된 자기 균형 이진 탐색 트리각 노드를 Red 또는 Black루트는 Black모든 리프는 BlackRed 노드의 자식은 반드시 Black(Red 연속 불가)루트부터 리프까지 Black 노드

codehortus.tistory.com

 

map : keyvalue 쌍을 저장하고 키를 통해 → 값을 빠르게 탐색 할 수 있는 자료 구조

set : 키만 저장하고 중복은 허용하지 않는 구조

map

  • 키와 값을 한쌍으로 묶어서 관리
  • 키는 유일해야 하고, 검색, 삽입, 삭제 가 평균 O(log N)
  • 내부적으로 이진 탐색 트리(레드-블랙 트리)를 사용한다.
  • ex) 전화번호부 , 이름 ,전화번호

set

  • 키만 저장, 즉 value 가 따로 필요 없을때 사용
  • 중복이 불가능, 이미 원소가 있다면 들어가지 않음
  • O(log N) 내부구조는 map 과 동일, 단 키가 존재한다는 차이가 있음
  • ex ) 콘서트 티켓명단, 이미 등록된 사람은 중복 불가, 누가 출입했는지 확인빠름

 

map 예제 코드

#include <iostream>
#include <map>
#include <string>
using namespace std;

int main() {
    map<string, int> score;

    // 삽입
    score["rtan"] = 95;
    score["goong"] = 88;
    score.insert({"yeorerbun", 100}); 

    // 검색
    cout << "rtan 점수: " << score["rtan"] << endl; // 95
    cout << "goong 점수: " << score.at("goong") << endl; // 88

    // 원소 확인
    if (score.find("tom") == score.end()) {
        cout << "tom 기록 없음!" << endl;
    }

    // 수정
    score["goong"] = 90; // 값 변경 (기존 key가 존재하면 수정)

    // 전체 순회 (맵의 각 요소는 first, second로 접근 가능!)
    for (auto &kv : score) {
        cout << kv.first << "의 점수: " << kv.second << endl;
    }
}

set 예제 코드

#include <iostream>
#include <set>
using namespace std;

int main() {
    set<int> s;

    // 삽입
    s.insert(5);
    s.insert(2);
    s.insert(9);
    s.insert(5); // 이미 5가 있으니 무시됨!

    // 원소 확인
    if (s.find(2) != s.end()) {
        cout << "2가 존재합니다!" << endl;
    }

    // 전체 순회
    for (auto &elem : s) {
        cout << elem << " "; // 2 5 9
    }
    cout << endl;

    // 삭제
    s.erase(5); // 5가 제거됨

    auto lb = s.lower_bound(2);//지정된 값 이상의 첫 번째 요소를 반환
    if (lb != s.end()) cout << "lower_bound(2) : " << *lb << endl; // 2
    
    auto ub = s.upper_bound(2);//지정된 값보다 큰 첫 번째 요소를 반환
    if (ub != s.end()) cout << "upper_bound(2) : " << *ub << endl; // 9
}
반응형

'c++ > STL' 카테고리의 다른 글

[STL] 순열(Permutation) & nth_element  (0) 2025.12.01
[STL] 우선순위 큐 (priority_queue)  (0) 2025.12.01
unordered_map & unordered_set  (0) 2025.11.30
multimap & multiset  (0) 2025.11.28
STL(Standard Template Library)  (0) 2025.11.27