C++ 공부

C++언어 기초 - 7. STL의 개념

Client Side 2025. 8. 26. 21:11

STL (Standard Template Library) : C++ 표준 라이브러리의 일부로 컨테이너, 알고리즘, 반복자 등의 템플릿 기반 구성 요소를 포함한다.

 

1. 컨테이너

  • 모든 컨테이너는 템플릿으로 구현되어 있으므로, 다양한 타입의 데이터를 저장할 수 있다.
  • 모든 컨테이너는 메모리 관리를 내부적으로 한다. 메모리 해제를 직접 고려하지 않아도 된다.
  • 대부분 컨테이너는 반복자를 제공한다. 따라서 내부 구현을 몰라도 동일한 방식으로 컨테이너를 순회할 수 있다.

 

1-1. 벡터

  • 템플릿 클래스로 구현되어 특정 타입에 종속되지 않는다.
  • 삽입되는 원소 개수에 따라 내부 배열의 크기가 자동으로 조정된다.
  • 임의 접근이 가능하다. (인덱스를 통해 특정 위치에 접근)
  • 삽입 / 삭제는 맨 뒤에 하는 게 좋다. (중간 삽입/삭제는 배열 복사가 필요하므로 비효율적)

1-1-1. 벡터를 선언하는 방법

#include <vector>

// 1. 기본 생성 및 초기화 없이 선언
vector<int> vec1;

// 2. 특정 크기와 초기값으로 벡터 선언
vector<int> vec2(5, 10); // 크기 5, 모든 원소가 10으로 초기화

// 3. 리스트 초기화로 벡터 선언
vector<int> vec3 = {1, 2, 3, 4, 5};

// 4. 다른 벡터를 기반으로 복사 초기화
vector<int> vec3 = {1, 2, 3, 4, 5};
vector<int> vec4(vec3); // vec3의 복사본 생성
//vector<int> vec4 = vec3 하면 대입이 됨

// 5. 2차원 벡터 초기화
vector<vector<int>> vec2D(3, vector<int>(4, 7)); // 3x4 행렬, 모든 원소가 7로 초기화

 

1-1-2. 벡터의 동작

  •  push_back 
    • 벡터의 맨 밑에 원소를 추가하는 메서드
    • 원소의 개수가 늘어남에 따라 크기는 자동으로 증가하므로, 별도의 메모리 관리를 신경 쓸 필요가 없다.
    • ex :  vec.push_back(10)
  •  pop_back 
    • 벡터의 맨 끝에 원소를 제거하는 메서드
    • 맨 끝 원소가 제거되면 벡터 크기가 자동으로 줄어든다.
    • ex : vec.pop_back()
  •  size 
    • 현재 벡터의 크기(원소 개수)를 확인할 때 사용하는 메서드.
    • 보통 벡터의 전체 원소를 대상으로 반복문을 돌릴 때 유용하게 쓰인다.
    • ex : vec.size()
  •  erase 
    • 특정 위치(또는 구간)의 원소를 제거하는 함수.
    • 벡터는 내부적으로 배열을 사용하므로, 중간 원소를 삭제할 때, 많은 원소를 옮겨야 할 수 있다.
    • 따라서 시간 복잡도가 커질 수 있으므로, 자주 사용하지 않는 것이 좋다.

 

1-2. 맵 (연관 컨테이너)

:  이름을 검색하여 연락처를 찾듯이, 특정 키를 사용하여 값을 검색하는 기능을 제공하는 컨테이너.

  • 키-값 쌍은  pair<const Key, Value> 형태로 저장.
  • 키 값을 기준으로 내부 데이터가 자동으로 정렬된다.
  • 중복된 키 값을 허용하지 않는다.

 

1-2-1. 맵을 선언하는 방법

  : 맵을 선언할 때는 키-값 쌍을 저장하기 위해 키 타입과 값 타입 두 가지를 지정해야 한다. 키 타입은 비교 연산이 가능해야 한다.

#include <iostream>
#include <map>

using namespace std;

// 정수 키와 문자열 값을 저장하는 map 예제
int main() {
    map<int, string> studentMap;

    // 요소 추가
    studentMap[101] = "Alice";
    studentMap[102] = "Bob";
    studentMap[103] = "Charlie";

    // 요소 출력
    for (const auto& pair : studentMap) {
        cout << "ID: " << pair.first << ", Name: " << pair.second << endl;
    }

    return 0;
}

/*
출력 결과:
ID: 101, Name: Alice
ID: 102, Name: Bob
ID: 103, Name: Charlie
*/