기본 Container별 Concepts
자주 쓰는 STL 컨테이너가 어떤 range concept를 만족하는지 빠르게 확인하기 위한 요약입니다.
빠른 표
| 컨테이너 | 대표 range concept | 추가 메모 |
|---|---|---|
std::vector<T> | random_access_range, contiguous_range, sized_range | vector<bool>은 contiguous_range 아님 |
std::deque<T> | random_access_range, sized_range | 연속 메모리는 아님 |
std::list<T> | bidirectional_range, sized_range | 연결 리스트 |
std::forward_list<T> | forward_range | size()가 없어 sized_range 아님 |
std::array<T, N> | random_access_range, contiguous_range, sized_range | 정적 크기 |
std::string | random_access_range, contiguous_range, sized_range | 문자 시퀀스 |
std::map, std::set | bidirectional_range, sized_range | 정렬 연관 컨테이너 |
std::unordered_map, std::unordered_set | forward_range, sized_range | 해시 기반 |
std::span<T> | contiguous_range, sized_range, view, borrowed_range | 비소유 뷰 |
std::string_view | contiguous_range, sized_range, view, borrowed_range | 비소유 문자열 뷰 |
실전에서 기억할 포인트
ranges::sort는random_access_range가 필요하므로list에는 바로 쓸 수 없다.- 컨테이너 대부분은
view가 아니고,span이나string_view같은 비소유 타입만view다. - 컨테이너가
borrowed_range인 경우는 드물다. 수명 문제를 항상 같이 봐야 한다.
셀프 체크
static_assert(std::ranges::random_access_range<std::vector<int>>);
static_assert(std::ranges::bidirectional_range<std::list<int>>);
static_assert(!std::ranges::sized_range<std::forward_list<int>>);
static_assert(std::ranges::borrowed_range<std::span<int>>);