✨✨✨ C++ STL(Standard Template Library) 개요 ✨✨✨

STL은 C++에서 제공하는 강력한 라이브러리로, 효율적인 코딩 및 알고리즘 설계에 도움을 줍니다. 다양한 데이터 구조와 알고리즘을 손쉽게 사용할 수 있으며, 코드의 간결성과 성능을 동시에 확보할 수 있습니다. STL은 세 가지 주요 구성 요소로 나뉩니다:

  1. 컨테이너(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
  2. 🧩🧩🧩 알고리즘(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
  3. 🔄🔄🔄 반복자(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 사용 시 유의사항 ⚠️⚠️⚠️

  1. 컨테이너 선택 시 시간복잡도와 메모리 요구사항을 고려하세요.
  2. 알고리즘 사용 시 반복자 범위를 정확히 지정해야 합니다.
  3. 해시 기반 컨테이너(unordered_map, unordered_set)는 키 충돌에 유의하세요.
  4. 조합 알고리즘 사용 시 입력 데이터가 정렬되어 있어야 올바르게 동작합니다.
  5. 디버깅 시 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

+ Recent posts