Core Programming/Modern C++ & System Design

C++ STL 총정리: 컨테이너, 반복자, 알고리즘 핵심 요약 및 예제

임베디드 친구 2024. 12. 20. 20:09
반응형

C++ 개발의 생산성을 결정짓는 가장 중요한 요소는 무엇일까요? 바로 STL(Standard Template Library)을 얼마나 자유자재로 다루느냐입니다. STL은 검증된 데이터 구조와 알고리즘을 제공하여 개발자가 밑바닥부터 코드를 짤 필요가 없게 해줍니다.

이번 포스팅에서는 STL의 3대 구성 요소인 컨테이너, 반복자, 알고리즘을 체계적으로 정리하고 실전 예제를 살펴보겠습니다.

Generated by Gemini AI.


1. STL의 3대 핵심 요소

STL은 서로 긴밀하게 연결된 세 가지 요소로 구성됩니다.

  1. 컨테이너(Container): 데이터를 저장하는 객체 (예: vector, list, map)
  2. 반복자(Iterator): 컨테이너의 원소에 접근하는 포인터와 유사한 객체
  3. 알고리즘(Algorithm): 데이터를 처리하는 함수 (예: sort, find)

2. 컨테이너(Container) 종류와 특징

데이터를 어떤 방식으로 저장하고 관리할지에 따라 적절한 컨테이너를 선택해야 합니다.

시퀀스 컨테이너 (순서가 있는 저장)

  • std::vector: 끝부분 요소 추가/삭제가 빠른 동적 배열 (가장 많이 사용됨)
  • std::list: 연결 리스트 구조로, 중간 삽입/삭제가 빈번할 때 유리함
  • std::deque: 앞과 뒤 양쪽에서 삽입/삭제가 빠름

연관 컨테이너 (키-값 구조)

  • std::set: 중복을 허용하지 않고 자동으로 정렬됨
  • std::map: (Key, Value) 쌍으로 저장하며 키를 기준으로 자동 정렬됨

컨테이너 선택 가이드 (시간 복잡도)

컨테이너 접근(Access) 검색(Search) 삽입/삭제(끝)
vector $O(1)$ $O(N)$ $O(1)$
list $O(N)$ $O(N)$ $O(1)$
map/set $O(\log N)$ $O(\log N)$ $O(\log N)$

3. 주요 컨테이너 실전 예제

3.1 std::vector: 동적 배열의 정석

C++
 
#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> v = {5, 2, 8, 1, 9};

    v.push_back(10); // 데이터 추가

    // 정렬 (알고리즘 활용)
    std::sort(v.begin(), v.end());

    std::cout << "Vector 출력: ";
    for (int n : v) std::cout << n << " "; // 범위 기반 for문
    return 0;
}

3.2 std::map: 효율적인 데이터 검색

C++
 
#include <iostream>
#include <map>
#include <string>

int main() {
    std::map<std::string, int> inventory;

    inventory["Apple"] = 500;
    inventory["Banana"] = 300;

    // 데이터 탐색
    if (inventory.find("Apple") != inventory.end()) {
        std::cout << "Apple 가격: " << inventory["Apple"] << "원" << std::endl;
    }
    return 0;
}

4. 알고리즘(Algorithm) 활용하기

STL 알고리즘은 반복자(begin, end)를 통해 컨테이너에 접근합니다.

std::sort와 std::for_each

C++
 
#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> nums = {3, 1, 4, 1, 5, 9};

    // 오름차순 정렬
    std::sort(nums.begin(), nums.end());

    // 람다 식을 활용한 출력
    std::cout << "정렬된 결과: ";
    std::for_each(nums.begin(), nums.end(), [](int n) {
        std::cout << n << " ";
    });

    return 0;
}

5. 결론: STL을 더 잘 쓰기 위한 팁

  1. 목적에 맞는 컨테이너 선택: 검색이 잦다면 map이나 unordered_map을, 단순 데이터 저장은 vector를 사용하세요.
  2. 알고리즘 적극 활용: 직접 for문을 돌려 정렬하거나 탐색하는 것보다 STL 알고리즘을 쓰는 것이 성능과 가독성 면에서 훨씬 우수합니다.
  3. Modern C++ 활용: auto 키워드와 람다(Lambda)를 곁들이면 STL 코드가 훨씬 간결해집니다.

C++ STL은 방대하지만, 자주 쓰이는 패턴 위주로 익히다 보면 코드의 질이 달라지는 것을 느끼실 겁니다. 질문이 있으시면 댓글로 남겨주세요!

반응형