태그: STL
37편
-
C++ STL 컨테이너: 연산별 성능 비교와 상황별 선택 기준
vector, map, unordered_map, deque, list의 내부 구조와 반복자 무효화 규칙, 메모리 할당 전략, 캐시 성능 차이를 측정 방법과 함께 비교하고 상황별 컨테이너 선택 기준을 정리합니다.
-
C++ 반복자 무효화: vector iterators incompatible 크래시 원인과 해결
vector iterators incompatible 같은 크래시를 일으키는 반복자 무효화를 vector·list·map·unordered_map·deque별 규칙으로 정리하고, 범위 기반 for에서 erase하는 실수를 포함한 10가지 오류 패턴과 안전한 삭제 방법을 설명합니다.
-
C++ vector vs list vs deque: 내부 구조와 벤치마크로 보는 컨테이너 선택
vector, list, deque의 내부 구조와 시간 복잡도를 비교하고, 뒤·앞·중간 삽입과 순회, 랜덤 접근 벤치마크로 실제 성능 차이를 확인합니다. 중간 삽입이 많아도 vector가 list보다 빠른 경우가 많은 이유를 캐시 효율로 설명합니다.
-
C++ map vs unordered_map: 레드-블랙 트리와 해시 테이블의 성능·메모리 비교
레드-블랙 트리인 map과 해시 테이블인 unordered_map을 삽입, 조회, 순회 비용과 메모리 사용량으로 비교합니다. 정렬 순회나 범위 탐색이 필요할 때와 평균 조회 속도가 중요할 때 무엇을 고를지, 커스텀 키 타입 작성법까지 설명합니다.
-
C++ 커스텀 Allocator: 메모리 풀·스택·추적 할당자와 PMR
C++ STL Allocator 인터페이스로 메모리 할당을 커스터마이징하는 방법을 메모리 풀, 스택, 추적 할당자 예제와 PMR(polymorphic_allocator)로 정리합니다. 할당자 비교, 전파 정책, 정렬 함정까지 다룹니다.
-
C++ 기술 면접 질문 30선: 포인터·RAII·가상 함수·STL·동시성 답변 정리
C++ 기술 면접에서는 포인터·RAII·가상 함수·STL·동시성 등 개념을 구두로 설명할 수 있어야 합니다. 이 글에서는 자주 나오는 질문 30가지와 답변 흐름을 주제별로 묶고, 면접관이 이어서 묻는 심화 내용까지 정리했습니다.
-
C++ STL 알고리즘 자주 쓰는 함수 20개: sort·lower_bound·accumulate·remove_if
C++ STL <algorithm>에서 자주 쓰는 함수 20개(sort, find, lower_bound, accumulate, transform, remove_if 등) 예제 정리. erase-remove 관용구와 binary_search 전제 조건 같은 실수도 다룹니다.
-
C++ set vs unordered_set: 성능 비교, 커스텀 비교자·해시, 교집합·합집합, 반복자 무효화
정렬된 순회가 필요하면 set, 평균 O(1) 조회가 중요하면 unordered_set을 고르는 기준을 성능 비교로 설명합니다. 커스텀 비교자와 Hash·KeyEqual 작성법, 중복 제거·교집합·합집합 예제, reserve·rehash, 반복자 무효화 규칙도 다룹니다.
-
C++ std::string 자주 쓰는 함수 정리: 검색·치환·분할과 흔한 실수, 성능 팁
C++ std::string 사용법 정리. 생성과 연결, find·substr·replace 같은 자주 쓰는 함수, 문자열 분할 같은 실전 예시, 자주 생기는 문제와 성능 최적화 팁을 예제로 다룹니다.
-
C++ std::vector 기초: 생성·삽입·삭제와 배열 대신 쓰는 이유
크기가 고정되고 범위 검사도 없는 C 배열 대신 std::vector를 쓰는 이유를 선언, 추가·삭제, operator[]와 at() 차이, 2차원 벡터, sort·find 예제로 보여줍니다. size()를 int로 받는 실수, 반복 중 삭제, reserve와 resize 혼동도 다룹니다.
-
C++ 태그 디스패칭: iterator_category로 오버로드 고르기와 if constexpr·Concepts 비교
값이 아니라 빈 구조체 타입으로 오버로드를 고르는 태그 디스패칭을 std::distance의 iterator_category 분기 예제로 설명합니다. 타입별 직렬화와 복사 최적화 예제, if constexpr·SFINAE·Concepts와 비교했을 때 언제 이 패턴이 여전히 읽기 쉬운지도 다룹니다.
-
STL 알고리즘 기본기: sort·find·count·transform·accumulate·copy·remove와 Ranges
C++ STL 알고리즘 정리. sort, find, count, transform, accumulate, copy, remove-erase 관용구 같은 기본 알고리즘과 C++20 Ranges·프로젝션, C++23 views, 자주 나는 에러를 예제로 다룹니다.
-
C++ 반복자: 종류와 연산, iterator_traits, 범위 기반 for의 디슈가링
Input부터 Random Access까지 반복자 카테고리별로 허용되는 연산과 복잡도, iterator_traits와 C++20 iterator_concept, 범위 기반 for가 실제로 어떤 코드로 풀리는지, 그리고 무효화된 반복자와 end() 역참조 같은 버그를 예제로 설명합니다.
-
C++ 함수 객체(펑터): 상태를 가진 호출 객체, STL 알고리즘 활용, 람다와의 차이
operator()를 오버로드한 함수 객체가 호출 사이에 상태를 유지하는 방법과 STL 알고리즘에서 쓰는 법을 설명하고, operator()의 const 누락, const를 지키면서 상태를 바꿔야 할 때의 mutable, 큰 펑터의 복사 비용을 std::ref로 줄이는 법을 예제로 다룹니다.
-
C++ std::bitset: 플래그 관리, 비트 마스크로 부분집합 열거, vector<bool>과 차이
std::bitset으로 플래그를 켜고 끄고 개수를 세는 방법, 문자열·정수 변환, 비트 마스크로 부분집합을 열거하는 패턴, 상태 머신과 집합 연산 예제를 설명하고 vector<bool>과의 차이를 비교합니다.
-
C++ replace·replace_if·replace_copy: 값 치환과 transform 중 무엇을 쓸까
std::replace와 replace_if로 원본 범위의 값을 바꾸고, replace_copy·replace_copy_if로 원본을 유지한 채 결과를 새로 만드는 방법, std::string::replace와의 혼동, transform과의 선택 기준을 데이터 정제 예제로 설명합니다.
-
C++ reverse·rotate·reverse_copy: 범위 뒤집기와 회전 알고리즘 사용법
std::reverse로 범위를 뒤집고 reverse_copy로 원본을 유지한 채 역순 사본을 만들며, rotate로 배열을 회전하는 방법을 팰린드롬 검사, LeetCode 189 배열 회전, 151 단어 순서 뒤집기 예제로 설명합니다.
-
C++ find·binary_search·lower_bound: 정렬 전제가 깨질 때 생기는 조용한 오류
C++ find, binary_search, lower_bound 등 STL 검색. 정렬 안 된 범위에서 binary_search를 쓰면 왜 조용히 틀린 결과가 나오는지, 비교자 불일치 함정까지 실전 코드로 설명합니다.
-
C++ set_union·set_intersection·set_difference: 정렬된 범위의 집합 연산
정렬된 범위에서 set_union·set_intersection·set_difference·set_symmetric_difference로 합·교·차집합을 구하고 includes로 포함 관계를 검사하는 방법을 권한 관리, 태그 필터링, 변경 사항 추적 예제로 설명합니다.
-
C++ std::copy·copy_if·copy_backward: 목적지 크기, 겹치는 범위, back_inserter
std::copy·copy_if·copy_n·copy_backward·move를 언제 골라 쓰는지 벡터 복제와 필터링 예제로 설명하고, 목적지 크기 부족, 겹치는 범위, move 후 원본 상태, back_inserter 같은 출력 반복자 선택 문제를 다룹니다.
-
C++ count·count_if와 all_of·any_of·none_of로 조건 집계하기
std::count로 특정 값의 개수를 세고 count_if에 람다를 넘겨 조건별로 집계하는 방법, 구조체 필드 기준 카운트, all_of·any_of·none_of로 조건을 검사하는 법을 통계 유틸리티 예제와 함께 설명합니다.
-
C++ fill·generate·iota로 범위 채우기: 테스트 데이터 생성 예제
std::fill과 fill_n으로 범위를 같은 값으로 채우고, generate에 람다나 함수 객체를 넘겨 난수·ID·구조체 데이터를 만들며, iota로 연속 값을 생성하는 방법을 테스트 데이터 생성기 예제와 함께 설명합니다.
-
C++ make_heap·push_heap·pop_heap: priority_queue 대신 힙을 직접 다룰 때
std::make_heap·push_heap·pop_heap·sort_heap으로 벡터를 직접 힙으로 관리하는 방법, 최대 힙과 최소 힙을 만드는 비교자, priority_queue와 비교한 장단점, Top-K 추출과 힙 정렬 구현을 예제로 설명합니다.
-
C++ min·max·minmax_element와 std::clamp: 값 비교와 범위 제한
두 값 비교용 std::min·max·minmax와 범위용 min_element·max_element·minmax_element의 차이, 커스텀 비교자, C++17 std::clamp로 마우스 좌표를 화면 안으로 제한하는 예제와 통계·정규화 패턴을 다룹니다.
-
C++ Algorithm Numeric | accumulate·reduce
<numeric>의 accumulate와 C++17 reduce·transform_reduce의 차이, inner_product, partial_sum과 inclusive·exclusive_scan, adjacent_difference, iota를 통계·복리 이자·이동 평균 계산 예제로 설명합니다.
-
C++ partition·stable_partition·partition_point: 조건으로 범위 나누기
std::partition으로 조건에 맞는 요소를 앞쪽으로 모으고, 상대 순서를 지키는 stable_partition과 비교하며, 분할된 범위에서 partition_point로 경계를 이진 탐색하는 방법과 3-way 분할, 퀵 정렬 한 단계 스케치를 다룹니다.
-
C++ next_permutation으로 순열·조합 만들기: 정렬 후 do-while 패턴
next_permutation과 prev_permutation으로 사전순 순열을 만드는 방법을 설명하고, 정렬부터 하고 do-while로 돌리는 패턴, 문자열 순열, n개 중 k개 순열과 조합 생성, 완전 탐색에 적용하는 예제를 다룹니다.
-
C++ remove·remove_if가 원소를 지우지 않는 이유: erase-remove와 C++20 erase_if
std::remove와 remove_if가 실제로 요소를 지우지 않고 뒤로 밀어 내기만 하는 이유를 설명하고, erase-remove 관용구, 정렬 후 unique로 중복 제거하는 방법, C++20 std::erase·erase_if로 간결하게 쓰는 법을 다룹니다.
-
상황별 C++ 알고리즘 고르기: STL로 충분한 경우와 직접 구현할 때, 흔한 성능 함정
로그 검색, 중복 제거, Top-K 추출, 정렬된 범위의 구간 검색 같은 상황마다 어떤 STL 알고리즘이 맞는지 고르는 기준입니다. binary_search 전제 위반, remove 후 erase 누락, 비교자 약순서 위반 같은 흔한 실수도 짚습니다.
-
C++ STL 알고리즘 기초: sort·find·transform·accumulate 실전 활용
for문으로 직접 짠 정렬·검색·집계에서 버그가 나는 상황을 std::sort, find_if, count_if, transform, accumulate로 바꾸는 방법을 보여줍니다. remove 후 erase 누락, accumulate 초기값 실수, 비교자 규칙 위반도 짚습니다.
-
C++ STL 고급 알고리즘: partition·merge·집합 연산·힙 연산 쓰는 법과 흔한 실수
partition과 stable_partition으로 조건 분할하기, 정렬된 두 범위를 merge와 set_union·set_intersection으로 합치고 교집합 구하기, make_heap·push_heap으로 우선순위 큐를 직접 다루는 법을 예제로 정리하고, 정렬되지 않은 입력을 넘기는 실수 같은 함정을 짚습니다.
-
std::vector 제대로 쓰기: 초기화 방법, capacity와 성장 배율, reserve·emplace_back 성능
C++ std::vector 정리. 초기화 방법, 주요 연산, capacity와 성장 배율(growth factor), reserve와 emplace_back의 성능 차이, 반복자 무효화 같은 자주 나는 에러를 예제로 다룹니다.
-
C++ 컨테이너 선택 가이드 | vector/list/deque/map/set 상황별 선택과 성능 최적화
앞쪽 삽입을 반복하다 시간 초과가 나는 경우처럼 컨테이너를 잘못 고른 상황에서 출발해 vector·deque·list와 map·set·unordered 계열을 연산 복잡도와 메모리 배치로 비교합니다. BFS·LRU 캐시 예제와 반복자 무효화, 해시 미정의 에러도 다룹니다.
-
C++ 코딩 테스트 준비: 백준·프로그래머스 유형별 STL 활용과 입출력 최적화
백준과 프로그래머스에서 자주 나오는 정렬, 해시, 투 포인터, DP, BFS/DFS, 그리디, 백트래킹 문제를 C++ STL로 푸는 방법을 유형별로 정리하고, 입력 크기로 허용 복잡도를 가늠하는 법과 cin 입출력 최적화를 다룹니다.
-
C++ vector 성능: 캐시 친화성, 용량 성장 전략, reserve 최적화
push_back만 반복했는데 느려지는 이유를 size와 capacity, 재할당 비용, 캐시 지역성으로 풀어 보고 reserve·shrink_to_fit·emplace_back을 쓸 시점을 가립니다. string의 SSO, erase-remove, 반복자 무효화 같은 흔한 실수도 다룹니다.
-
C++ map·unordered_map·flat_map: 성능 비교와 선택 기준
std::map(레드-블랙 트리), unordered_map(해시 테이블), C++23 flat_map의 내부 구조 차이가 검색·삽입 성능에 어떻게 드러나는지 비교합니다. lower_bound 범위 검색, 커스텀 키의 해시 함수, operator[]가 원소를 몰래 만드는 문제와 선택 기준을 다룹니다.
-
C++ 코테용 STL 컨테이너/알고리즘 시간복잡도 치트시트 [#32-3]
코딩테스트에서 자료구조를 잘못 골라 시간 초과가 나지 않도록 vector·deque·list, map·unordered_map, priority_queue·stack·queue의 연산별 시간복잡도와 반복자 무효화 규칙을 표로 모았습니다. 문제 유형별 추천 조합과 흔한 실수도 담았습니다.