프로그래밍/C,C++

[Modern C++] STL 자료구조

GONII 2025. 3. 24. 17:27

C++ 표준 라이브러리(std)에서 제공하는 주요 자료구조(Container)들은 크게 Sequence Container(순차 컨테이너), Associative Container(연관 컨테이너), Unordered Container(비순서 연관 컨테이너), Container Adapter(컨테이너 어댑터)로 나눌 수 있습니다.


1. Sequence Container (순차 컨테이너)

요소를 특정 순서로 저장하는 컨테이너입니다.

컨테이너 설명 특징
std::vector 동적 크기 배열 - 빠른 임의 접근(O(1)) - 끝에서 추가/삭제 O(1), 중간 삽입/삭제 O(n)
std::deque 양쪽 끝에서 삽입/삭제 가능한 동적 배열 - 앞뒤에서 O(1) 삽입/삭제 - 랜덤 접근 가능(O(1))
std::list 이중 연결 리스트 - 중간 삽입/삭제 O(1) - 랜덤 접근 불가 (O(n))
std::forward_list 단일 연결 리스트 - std::list보다 메모리 절약 - 단방향 순회 가능
std::array 고정 크기 배열 - 크기가 고정된 std::vector 대체 - O(1) 임의 접근
std::span (C++20) 배열 뷰(소유권 없음) - 원본 데이터를 수정하지 않고 참조 가능

2. Associative Container (연관 컨테이너)

자동 정렬된 키-값 데이터를 저장하는 컨테이너입니다.

컨테이너 설명 특징
std::set 중복 없는 정렬된 집합 - 삽입/삭제/탐색 O(log n)
std::multiset 중복 허용 정렬된 집합 - std::set과 같지만 중복 허용
std::map 키-값 쌍 저장, 정렬된 연관 배열 - 키 기반 탐색 O(log n)
std::multimap 중복 허용 정렬된 맵 - std::map과 같지만 키 중복 허용
  • 내부적으로 Red-Black Tree(레드-블랙 트리) 기반으로 동작하여 자동 정렬이 유지됩니다.

3. Unordered Container (비순서 연관 컨테이너)

해시 기반의 연관 컨테이너로 정렬되지 않지만 평균적으로 탐색/삽입/삭제가 O(1) 입니다.

컨테이너 설명 특징
std::unordered_set 중복 없는 해시 기반 집합 - std::set과 같지만 해시 사용
std::unordered_multiset 중복 허용 해시 기반 집합 - std::multiset과 같지만 해시 사용
std::unordered_map 해시 기반 키-값 저장소 - std::map보다 빠름 (평균 O(1))
std::unordered_multimap 중복 허용 해시 기반 맵 - std::multimap과 같지만 해시 사용
  • 내부적으로 **Hash Table(해시 테이블)**을 사용합니다.

4. Container Adapter (컨테이너 어댑터)

기존 컨테이너(vector, deque, list)를 기반으로 동작하며, 특정 동작을 제한하여 활용할 수 있는 컨테이너입니다.

컨테이너 설명 기본 컨테이너
std::stack LIFO(Last-In, First-Out) 스택 std::deque (기본값)
std::queue FIFO(First-In, First-Out) 큐 std::deque (기본값)
std::priority_queue 우선순위 큐 (최대 힙) std::vector (기본값)
  • std::stack과 std::queue는 list 또는 vector 기반으로도 사용할 수 있습니다.
  • std::priority_queue는 내부적으로 힙(Heap) 자료구조를 사용하여 최댓값 또는 최솟값을 빠르게 찾을 수 있습니다.

요약

  • 배열 기반: vector, deque, array, span
  • 연결 리스트 기반: list, forward_list
  • 정렬된 연관 컨테이너: set, map, multiset, multimap
  • 해시 기반 연관 컨테이너: unordered_set, unordered_map, unordered_multiset, unordered_multimap
  • 어댑터: stack, queue, priority_queue

어떤 자료구조를 사용할지 선택할 때는 삽입/삭제/탐색의 시간 복잡도, 메모리 사용량, 정렬 여부 등을 고려해야 합니다. 🚀

반응형

'프로그래밍 > C,C++' 카테고리의 다른 글

[Modern C++] 람다 표현식 (Lambda Expression)  (0) 2025.03.26
[Modern C++] decltype  (0) 2025.03.25
[Modern C++] std::atomic  (1) 2025.03.21
[Modern C++] 동기화 기법(Synchronization)  (0) 2025.03.20
[Modern C++] std::thread  (0) 2025.03.11