STL 총정리

eomcri·2025년 2월 18일

이 글은 C++의 STL을 공부한 내용을 정리한 내용입니다. 잘 정리하여 추후 복습에 도움을 얻기 위해 작성하였습니다.

📌 목차

STL(Standard Template Library)?

STL은 C++에 내장된 템플릿 기반의 라이브러리로 컨테이너(Container), 반복자(Iterator) 그리고 알고리즘(Algorithm)으로 구성되어 있다.

  • 컨테이너(Container): 데이터를 저장 및 관리하는 구조체(자료구조)들의 집합
  • 반복자(Iterator): 컨테이너의 데이터를 순회하기 위한 포인터
  • 알고리즘(Algorithm): 정렬, 탐색, 삽입, 삭제를 효율적이고 제네릭하게 제공

STL을 잘 파악하고 있다 -> 코딩 테스트에 빠르게 적용하여 문제를 해결할 수 있다!


컨테이너

리스트

vector

vector는 동적 배열이라고 생각하면 된다. 배열이기 때문에 연속적인 메모리 블록을 사용하여 랜덤 접근이 빠르다. 하지만 동적 배열의 특성 상 마지막 원소를 추가/제거하는 것은 유리하지만 중간에 데이터를 삽입/제거 하는 것은 많은 비용이 들 수 있다(데이터 단체 이동!).

주요 함수

  • push_back(value): 맨 뒤에 데이터 추가
  • pop_back(value): 맨 뒤의 데이터 제거
  • size(): 원소의 개수 리턴
  • capacity(): 현재 할당된 메모리 크기 리턴
    • reserve(): 벡터의 용량을 지정하여 미리 할당(재할당 및 복사를 방지)
  • at(index): 해당 위치의 원소 반환 v.at(index) == V[index]
  • front(): 첫 번째 원소 값 리턴
  • back(): 마지막 원소 리턴
  • clear(): 모든 원소 제거
  • insert(iterator, value): 중간에 데이터 삽입
  • erase(iterator,iterator): 지정된 구간 데이터 삭제(인자 1개: 해당 위치 제거, 인자 2개: 해당 구간 전체 삭제)
  • data(): 내부 배열 포인터 반환
샘플 코드
  #include <iostream>
  #include <vector>

  int main() {
      std::vector<int>

      // 원소 추가
      v.push_back(1);
      v.push_back(9);

      // 마지막 원소 제거
      v.pop_back();

      // 첫 번째 원소 접근
      std::cout << "처음: " << v.front() << std::endl; // 1

      // 중간에 원소 삽입
      v.insert(v.begin() + 1, 3); // 1, 3

      // 원소 제거 (두 번째 원소 삭제)
      v.erase(v.begin() + 1); // 1만 남음

      // 결과 출력
      std::cout << "최종 크기: " << v.size() << std::endl;
      std::cout << "첫 번째 원소: " << v.front() << std::endl;

      return 0;
  }

list

list는 이중 링크드 리스트를 구현한 것이다. 데이터의 앞 뒤 정보를 가지고 있기 때문에 데이터 중간 삽입이 유리하다. 하지만 데이터를 접근하기 위해서는 처음부터 순회해야 하기 때문에 랜덤 접근이 느리다.

주요 함수

  • push_back(value): 맨 뒤에 데이터 추가
  • pop_back(value): 맨 뒤의 데이터 제거
  • push_front(value): 맨 앞에 데이터 추가
  • pop_front(value): 맨 앞의 데이터 제거
  • insert(iterator, value): 중간에 데이터 삽입
  • erase(iterator,iterator): 지정된 구간 데이터 삭제
샘플 코드
#include <iostream>
#include <list>

int main() {
    std::list<int> lst;

    // 원소 추가
    lst.push_back(10);
    lst.push_back(20);
    lst.push_front(30); // 30 10 20

    // 중간에 원소 삽입
    auto it = lst.begin(); // begin은 head, rbegin은 tail처럼 동작!
    ++it; // 두 번째 위치로 이동
    lst.insert(it, 15);  // 30 15 10 20
}

deque(데크)

deque는 양방향 동적 배열이다. 데이터를 양쪽 끝에서 추가/삭제 하는 데 용이하여 스택이나 큐를 구현할 때 사용하기 좋다. 역시 배열이므로 중간에서 삽입/삭제가 비효율적이다.

주요 함수

  • push_back(value): 맨 뒤에 원소 추가
  • pop_back(): 맨 뒤의 원소 제거
  • push_front(value): 맨 앞에 원소 추가
  • pop_front(): 맨 앞의 원소 제거
  • at(index): 지정된 인덱스의 원소 리턴
  • front(): 첫 번째 원소 리턴
  • back(): 마지막 원소 리턴
  • clear(): 모든 원소 제거
  • insert(iterator, value): 중간에 데이터 삽입
  • erase(iterator,iterator): 지정된 구간 데이터 삭제
샘플 코드
#include <iostream>
#include <deque>

int main() {
    std::deque<int> dq;

    // 원소 추가
    dq.push_back(20);
    dq.push_back(30);
    dq.push_front(10); // 10 20 30

    // 맨 앞 원소 제거
    dq.pop_front();  // 20 30
    
    // 맨 뒤 원소 제거
    dq.pop_back(); // 20

    // 결과 출력
    std::cout << "첫 번째 원소: " << dq.front() << std::endl;
    std::cout << "데크의 크기: " << dq.size() << std::endl;

    return 0;
}

#include 
#include 

int main() {
std::deque dq;

// 원소 추가
dq.push_back(20);
dq.push_back(30);
dq.push_front(10); // 10 20 30

// 맨 앞 원소 제거
dq.pop_front();  // 20 30

// 맨 뒤 원소 제거
dq.pop_back(); // 20

// 결과 출력
std::cout << "첫 번째 원소: " << dq.front() << std::endl;
std::cout << "데크의 크기: " << dq.size() << std::endl;

return 0;

}

map

map은 key-value를 pair로 가지는 컨테이너이다. 각 원소의 key 값은 중복을 허용하지 않는 유일한 값이고 자동으로 정렬된다. 레드-블랙 트리로 구현되어 있다.

주요 함수

  • insert(pair): 키-값 쌍 삽입
  • erase(key): 키로 요소 제거
  • find(key): 키로 요소 검색 (iterator 반환)
    • key가 있으면 해당 key의 iterator를 반환하나 없으면 end() 리턴!
  • operator[key]: 키로 값에 접근 또는 삽입
  • size(): 요소 개수 반환
profile
게임 개발자가 꿈인 게이머

0개의 댓글