std::flat_map
과std::flat_set
은C++26
에 새롭게 도입된 연관 컨테이너입니다.- 기존의
std::map
,std::set
과 달리 내부적으로 정렬된std::vector
를 기반 으로 하여 구현되며, 메모리 효율성과 캐시 친화성이 뛰어난 것이 특징입니다.
-
컨테이너 내부 구조 정렬 여부 중복 허용 삽입/삭제 성능 검색 성능 std::flat_map
std::vector<std::pair<Key, T>>
있음 ❌ 느림 ( O(n)
)빠름 ( O(log n)
)std::flat_set
std::vector<Key>
있음 ❌ 느림 ( O(n)
)빠름 ( O(log n)
)
-
cpp
#include <flat_map> #include <iostream> int main() { std::flat_map<int, std::string> fmap = { {3, "세"}, {1, "일"}, {2, "이"} }; for (auto& [k, v] : fmap) std::cout << k << ": " << v << '\n'; }
-
출력 결과:
1: 일 2: 이 3: 세
자동 정렬된 상태로 출력됩니다.
-
cpp
#include <flat_set> #include <iostream> int main() { std::flat_set<int> fset = {5, 2, 4, 1, 3}; for (int x : fset) std::cout << x << ' '; }
-
출력 결과:
1 2 3 4 5
입력 순서와 무관하게 자동 정렬됩니다.
- 내부는 정렬된 벡터 구조 (
std::vector
)로 되어 있어 순차 접근 성능이 뛰어납니다. - 검색 은 이진 탐색으로 빠르게 처리되며, 복잡도는
O(log n)
입니다. - 삽입/삭제는 재정렬이 필요하므로 비효율적일 수 있습니다.
- 삽입이 적고 검색/순회가 빈번한 경우에 성능 이점을 얻습니다.
C++
표준 라이브러리 컨테이너와 호환성이 좋습니다.
- 실무에서는 이미
boost
라이브러리의boost::container::flat_map
,flat_set
이 널리 사용되었습니다. - 이들 컨테이너의 효율성과 실용성이 입증되었고, 이를 기반으로
C++
표준화가 진행되어C++26
에 공식 채택되었습니다.
-
비교 항목 std::map
std::flat_map
내부 구조 레드-블랙 트리 정렬된 벡터 삽입 성능 O(log n)
O(n)
삭제 성능 O(log n)
O(n)
검색 성능 O(log n)
O(log n)
순차 접근 성능 느림 빠름 (메모리 연속) 메모리 사용 높음 (포인터 기반) 낮음 (연속 메모리)
flat_
계열은 읽기 중심의 고정된 데이터셋에 적합합니다.
std::flat_map
과std::flat_set
은 고성능이 필요한 읽기 중심의 애플리케이션에서 유용하게 사용할 수 있는 컨테이너입니다.- 만약 데이터의 삽입과 삭제가 빈번하다면 기존의
std::map
,std::set
이 더 적합할 수 있으므로 용도에 따라 적절히 선택하는 것이 중요합니다.
- 도움이 되셨으면 하단의 ❤️ 공감 버튼 부탁 드립니다. 감사합니다! 😄
- 일부 모바일 환경에서는 ❤️ 버튼이 보이지 않습니다.
'C C++' 카테고리의 다른 글
C++에서 제안된 고성능 컨테이너 std::hive (0) | 2025.07.13 |
---|---|
C++ auto 자동 타입 추론의 이해 (0) | 2025.07.11 |
C++ promise와 shared_future를 활용한 멀티쓰레드 동기화 (0) | 2025.06.27 |
Modern C++에서 std::async와 std::future를 활용한 비동기 예외 처리 (0) | 2025.06.26 |
Modern C++에서 복수 쓰레드(thread)를 동일 시간에 동시 실행하는 방법 (0) | 2025.06.26 |