2 minute read

STL의 개념


STL은 C++에서 제공하는 템플릿 기반의 라이브러리로, 자료 구조(컨테이너), 알고리즘, 반복자(iterator)를 포함합니다.
템플릿을 사용하기 때문에 다양한 데이터 타입에 대해 동일한 코드를 사용할 수 있다는 장점이 있습니다.

STL의 구성 요소


STL은 크게 세 가지 주요 구성 요소로 이루어져 있습니다.

  1. 컨테이너(Containers): 데이터를 저장하는 객체입니다. 배열, 리스트, 벡터, 맵 등 다양한 종류의 컨테이너가 제공됩니다.
  2. 알고리즘(Algorithms): 컨테이너에 저장된 데이터를 처리하는 함수 템플릿입니다. 정렬, 검색, 삭제, 복사 등 다양한 알고리즘이 제공됩니다.
  3. 반복자(Iterators): 컨테이너의 요소를 순회하는 객체입니다. 포인터와 유사한 역할을 하며, 알고리즘과 컨테이너를 연결하는 역할을 합니다.

컨테이너(Containers)


다양한 컨테이너들이 제공되며, 각각의 특징과 용도가 다릅니다.

  • 시퀀스 컨테이너(Sequence Containers): 요소들이 특정 순서로 저장됩니다.
    • vector: 동적 배열. 요소에 빠르게 접근 가능 (임의 접근). 끝에서 삽입/삭제가 빠름.
    • deque(Double-Ended Queue): 양쪽 끝에서 삽입/삭제가 빠른 큐.
    • list: 이중 연결 리스트. 중간 삽입/삭제가 빠름. 임의 접근은 느림.
    • forward_list: 단일 연결 리스트. list보다 메모리 효율적.
    • array: 고정 크기 배열. C 스타일 배열과 유사하지만 추가적인 기능 제공.
  • 연관 컨테이너(Associative Containers): 키(key)를 사용하여 요소에 접근하며, 요소들은 특정 기준에 따라 정렬되어 저장됩니다.
    • set: 중복된 요소를 허용하지 않는 집합. 요소들은 오름차순으로 정렬됨.
    • multiset: 중복된 요소를 허용하는 집합.
    • map: 키-값 쌍을 저장하는 컨테이너. 키는 중복될 수 없음. 요소들은 키를 기준으로 오름차순으로 정렬됨.
    • multimap: 키-값 쌍을 저장하는 컨테이너. 키의 중복을 허용함.
  • 컨테이너 어댑터(Container Adapters): 기존 컨테이너를 사용하여 특정 인터페이스를 제공합니다.
    • stack: LIFO(Last-In, First-Out) 스택.
    • queue: FIFO(First-In, First-Out) 큐.
    • priority_queue: 우선순위 큐. 요소들은 우선순위에 따라 정렬됨.



알고리즘(Algorithms)


<algorithm> 헤더 파일에 정의되어 있으며, 반복자를 통해 컨테이너의 요소에 접근하여 다양한 작업을 수행합니다.

  • std::sort: 정렬
  • std::find: 검색
  • std::copy: 복사
  • std::remove: 삭제
  • std::transform: 요소 변환
  • std::accumulate: 누적
  • std::for_each: 각 요소에 함수 적용



반복자(Iterators)


컨테이너의 요소를 가리키는 객체로, 포인터와 유사하게 동작합니다.

  • begin(): 컨테이너의 첫 번째 요소를 가리키는 반복자를 반환
  • end(): 컨테이너의 마지막 요소 바로 다음을 가리키는 반복자를 반환.
  • ++: 다음 요소로 이동
  • --: 이전 요소로 이동
  • *: 반복자가 가리키는 요소에 접근



STL의 장점


  1. 재사용성: 템플릿 기반이므로 다양한 데이터 타입에 대해 동일한 코드를 사용할 수 있습니다.
  2. 효율성: 잘 구현된 알고리즘과 자료 구조를 제공하여 높은 성능을 보장합니다.
  3. 표준화: C++ 표준의 일부이므로 모든 C++ 컴파일러에서 사용할 수 있습니다.
  4. 생산성 향상: 직접 구현할 필요 없이 제공되는 기능을 사용하므로 개발 시간을 단축할 수 있습니다.

주의사항


  • 적절한 컨테이너 선택: 문제에 맞는 컨테이너를 선택하는 것이 중요합니다. 예를 들어, 빈번한 삽입/삭제가 일어나는 경우 vector보다는 list를 사용하는 것이 좋습니다.
  • 반복자 무효화: 컨테이너의 요소를 추가하거나 삭제할 때 반복자가 무효화될 수 있으므로 주의해야 합니다.



코드


#include <iostream>
#include <vector>
#include <algorithm>

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

    // 정렬
    std::sort(numbers.begin(), numbers.end());

    // 출력
    for (int num : numbers) { // 범위 기반 for 루프
        std::cout << num << " ";
    }
    std::cout << std::endl;

    // 특정 값 찾기
    auto it = std::find(numbers.begin(), numbers.end(), 8);
    if (it != numbers.end()) {
        std::cout << "Found 8 at index: " << std::distance(numbers.begin(), it) << std::endl;
    }

    return 0;
}



Top