
✨✨✨ C++ STL(Standard Template Library) 개요 ✨✨✨
STL은 C++에서 제공하는 강력한 라이브러리로, 효율적인 코딩 및 알고리즘 설계에 도움을 줍니다. 다양한 데이터 구조와 알고리즘을 손쉽게 사용할 수 있으며, 코드의 간결성과 성능을 동시에 확보할 수 있습니다. STL은 세 가지 주요 구성 요소로 나뉩니다:
- 컨테이너(Container) 🗃️
- 예를 들어, vector는 동적 배열로 요소를 순서대로 저장하며, 빠르게 접근하고 삽입할 수 있습니다. map은 키-값 쌍을 저장하며 자동으로 정렬하여 탐색과 삽입을 효율적으로 처리합니다. set은 중복 없는 데이터를 저장하며 정렬된 상태로 유지됩니다.
- 데이터를 저장하고 관리하는 데 사용됩니다.
- 주요 컨테이너:
- Sequence Containers: 순서를 유지하는 컨테이너
- vector, deque, list, array, forward_list
- Associative Containers: 정렬된 데이터 관리
- set, multiset, map, multimap
- Unordered Containers: 해시 기반 컨테이너
- unordered_set, unordered_multiset, unordered_map, unordered_multimap
- Sequence Containers: 순서를 유지하는 컨테이너
- 🧩🧩🧩 알고리즘(Algorithm) 🧩🧩🧩
- 컨테이너의 데이터를 조작하고 처리하는 함수 집합입니다.
- 주요 알고리즘:
- 정렬: sort, stable_sort, partial_sort
- 검색: binary_search, find, find_if, equal_range
- 수치 연산: accumulate, adjacent_difference, inner_product
- 변환: transform, replace, unique
- 조합: next_permutation, prev_permutation
- 🔄🔄🔄 반복자(Iterator) 🔄🔄🔄
- 컨테이너 요소에 접근하기 위한 도구로, 포인터처럼 동작합니다.
- 주요 반복자 유형:
- input_iterator, output_iterator, forward_iterator, bidirectional_iterator, random_access_iterator
- 실용적 사용 사례: 예를 들어, 컨테이너의 요소를 역순으로 출력하거나 특정 조건을 만족하는 요소를 찾는 데 반복자를 사용할 수 있습니다.
#include <vector> #include <iostream> #include <algorithm> int main() { std::vector<int> v = {10, 20, 30, 40, 50}; // 조건을 만족하는 첫 번째 요소 찾기 auto it = std::find_if(v.begin(), v.end(), [](int x) { return x > 25; }); if (it != v.end()) { std::cout << "첫 번째 25보다 큰 값: " << *it << std::endl; } return 0; }
🛠️🛠️🛠️ STL 컨테이너의 특징과 사용법 🛠️🛠️🛠️
📂📂📂 1. Sequence Containers 📂📂📂
- Vector:
- 동적 배열로, 크기가 가변적입니다.
- 주요 메서드: push_back, pop_back, insert, erase, resize
- Deque:
- 양쪽 끝에서 삽입과 삭제가 O(1)입니다.
- 주요 메서드: push_front, push_back, pop_front, pop_back
- List:
- 이중 연결 리스트로, 삽입/삭제가 빠릅니다.
- 주요 메서드: push_back, push_front, insert, erase, remove
- Array:
- 정적 크기의 배열입니다.
- 주요 메서드: at, fill, swap
- Forward List:
- 단일 연결 리스트입니다.
- 주요 메서드: push_front, pop_front, insert_after, erase_after
📚📚📚 2. Associative Containers 📚📚📚
- Set:
- 중복을 허용하지 않으며, 자동으로 정렬됩니다.
- 주요 메서드: insert, erase, find, lower_bound, upper_bound
- Map:
- 키-값 쌍으로 저장하며, 키는 고유합니다.
- 주요 메서드: insert, erase, find, at, operator[]
🌀🌀🌀 3. Unordered Containers 🌀🌀🌀
- Unordered Set:
- 중복을 허용하지 않으며, 해시 테이블 기반입니다.
- 주요 메서드: insert, erase, find
- Unordered Map:
- 키-값 쌍으로 저장하며, 키 순서가 없습니다.
- 주요 메서드: insert, erase, find, operator[]
🧠🧠🧠 STL 알고리즘의 주요 사용법 🧠🧠🧠
- 정렬 (O(N log N)):
- #include <algorithm> #include <vector> std::vector<int> v = {5, 3, 8, 1}; std::sort(v.begin(), v.end()); // {1, 3, 5, 8}
- 검색 (O(log N) for sorted containers):
- #include <algorithm> #include <vector> std::vector<int> v = {1, 3, 5, 8}; if (std::binary_search(v.begin(), v.end(), 3)) { // 3이 존재함 }
- 수치 연산 (O(N)):
- #include <numeric> #include <vector> std::vector<int> v = {1, 2, 3, 4}; int sum = std::accumulate(v.begin(), v.end(), 0); // 합계: 10
- 변환 (O(N)):
- #include <algorithm> #include <vector> std::vector<int> v = {1, 2, 3}; std::vector<int> result; std::transform(v.begin(), v.end(), std::back_inserter(result), [](int x) { return x * 2; }); // result: {2, 4, 6}
- 조합 (O(N!)):
- #include <algorithm> #include <vector> std::vector<int> v = {1, 2, 3}; do { for (int num : v) { std::cout << num << " "; } std::cout << std::endl; } while (std::next_permutation(v.begin(), v.end()));
- 계수 (O(N)):
- #include <algorithm> #include <vector> std::vector<int> v = {1, 2, 2, 3, 4, 2}; int count = std::count(v.begin(), v.end(), 2); // 2의 개수: 3
- 삭제 (O(N)):
- #include <algorithm> #include <vector> std::vector<int> v = {1, 2, 3, 4, 5}; v.erase(std::remove(v.begin(), v.end(), 3), v.end()); // 3 제거
- 최댓값/최솟값 찾기 (O(N)):
- #include <algorithm> #include <vector> std::vector<int> v = {4, 2, 8, 1}; auto maxIt = std::max_element(v.begin(), v.end()); // 최댓값 위치 auto minIt = std::min_element(v.begin(), v.end()); // 최솟값 위치
🎛️🎛️🎛️ STL 반복자의 사용 🎛️🎛️🎛️
- 기본 반복자 사용:
- #include <vector> std::vector<int> v = {1, 2, 3}; for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) { std::cout << *it << " "; }
- 자동화된 반복자 사용 (C++11 이후):
- #include <vector> std::vector<int> v = {1, 2, 3}; for (auto it : v) { std::cout << it << " "; }
- 역순 반복자:
- #include <vector> std::vector<int> v = {1, 2, 3}; for (auto it = v.rbegin(); it != v.rend(); ++it) { std::cout << *it << " "; }
- 상수 반복자(const_iterator):
- #include <vector> const std::vector<int> v = {1, 2, 3}; for (std::vector<int>::const_iterator it = v.cbegin(); it != v.cend(); ++it) { std::cout << *it << " "; }
⚠️⚠️⚠️ STL 사용 시 유의사항 ⚠️⚠️⚠️
- 컨테이너 선택 시 시간복잡도와 메모리 요구사항을 고려하세요.
- 알고리즘 사용 시 반복자 범위를 정확히 지정해야 합니다.
- 해시 기반 컨테이너(unordered_map, unordered_set)는 키 충돌에 유의하세요.
- 조합 알고리즘 사용 시 입력 데이터가 정렬되어 있어야 올바르게 동작합니다.
- 디버깅 시 STL 컨테이너를 이해하기 위해 디버거와 함께 출력해 보세요.
'UnrealCamp' 카테고리의 다른 글
| 7주차 Day4 [캐릭터 #2 코스메틱] (0) | 2025.01.30 |
|---|---|
| 7주차 Day2 [Lyra Input] (0) | 2025.01.28 |
| 2주차 Day2 C++공부(심화 자료구조) (0) | 2024.12.24 |
| 2주차 Day1 C++공부(심화 자료구조) (0) | 2024.12.23 |
| Day3 (1) | 2024.12.18 |