STL 기초
STL (Standard Template Library) 표준 템플릿 라이브러리
C++ 에서 공식적으로 지원하는 데이터에 의존하지 않고 사용할 수 있는 라이브러리
STL 는 3가지로 이루어져있음
- 컨테이너
- 알고리즘
- 반복자
1. 컨테이너
데이터를 담는 자료구조
1. 템플릿 구성으로 이루어져있음, 다양한 타입의 데이터를 저장가능
2. 메모리 관리를 내부적으로 함 (메모리 누수 걱정 없음)
3. 대부분 컨테이너는 반복자를 제공함
1-1. 벡터
1. 템플릿 클래스로 구현
2. 삽입되는 원소 개수에 따라 내부 배열의 크기가 자동을 조정
(메모리 관리를 자동으로 해주기 때문에 데이터 삽입, 삭제, 정렬만 신경쓰면서 프로그램 구현 가능/ 세부사항에 대해서는 고려X)
3. 임의 접근이 가능함 (배열첨자 연산자 [ ] 를 통해서 배열의 특정 위치에 접근 가능)

삽입 / 삭제는 맨 뒤에 하는 게 좋음 (중간 삽입 / 삭제는 배열 복사가 필요하므로 비효율적)
1 이 맨 앞으로 가게 되면 원소가 하나씩 다 뒤로 밀림 → 많은 연산을 해야됨
→ 맨 뒤에 원소를 추가하는 방식이면 효율적임

벡터의 선언 방법
1. 빈 벡터를 선언하거나 특정 값으로 초기화하는 코드
vec 는 빈 벡터이므로 크기가 0, vec2 의 크기는 5, 모든 값이 10

#include <vector>
using namespace std;
// 1. 기본 생성 및 초기화 없이 선언
vector<int> vec1;
// 2. 특정 크기와 초기값으로 벡터 선언
vector<int> vec2(5, 10); // 크기 5, 모든 원소가 10으로 초기화
//메인 함수 생략
2. 초기화 리스트를 사용하여 백터를 선언
특정 값으로 벡터를 초기화할 때 자주 사용
초기화하는 원소의 개수가 적을 때 주로 활용

#include <vector>
using namespace std;
// 3. 리스트 초기화로 벡터 선언
vector<int> vec3 = {1, 2, 3, 4, 5};
//메인 함수 생략
3. 다른 벡터의 복사하거나 대입하는 방법
기존에 생성된 벡터의 복사본을 만들 때 많이 사용

#include <vector>
using namespace std;
// 다른 벡터를 기반으로 복사 초기화
vector<int> vec3 = {1, 2, 3, 4, 5};
vector<int> vec4(vec3); // vec3의 복사본 생성
//vector<int> vec4 = vec3 하면 대입이 됨
//메인 함수 생략
4. 2차원 배열처럼 벡터를 사용 (벡터의 타입을 벡터로 하면 됨)

#include <vector>
using namespace std;
// 2차원 벡터 초기화
vector<vector<int>> vec2D(3, vector<int>(4, 7)); // 3x4 행렬, 모든 원소가 7로 초기화
//메인 함수 생략
벡터의 동작
push_back : 벡터의 맨 끝에 원소를 추가하는 메서드

pop_back : 벡터의 맨 끝에 원소를 제거하는 메서드

size : 현재 벡터의 크기(원소 개수)를 확인할 때 사용하는 메서드

erase : 특정 위치(또는 구간)의 원소를 제거하는 함수
되도록 사용 X → 벡터의 성능을 낮춤
배열과 유사하기 때문에 중간에 있는 배열을 삭제하면 추가적인 연산이 필요하기 때문임 (비효율적인 연산)

1-2. 맵
특정 키를 사용하여 값을 검색하는 기능을 제공
ex) 핸드폰에서 이름을 검색해서 전화번호를 찾는 것
특징
- 키-값 쌍의 형태 pair<const Key, Value>
- 키값을 기준으로 내부 데이터가 자동으로 정렬
- 중복된 키값을 허용 X
맵의 선언 방법
키-값 쌍을 저장하기 위해 키 타입과 값 타입 두 가지를 지정 / 두 타입은 동일할 수도, 서로 다를 수도 있음
키 타입은 비교 연산이 가능해야 함
맵 선언 및 사용

맵은 key 순으로 오름차순 정렬됨.
사용자가 별도로 정렬을 수행하지 않아도, 삽입 및 삭제가 이루어질 때마다 내부적으로 정렬 상태를 유지

insert()
make_pair() 를 이용하여 pair 객체를 생성 → insert 함수 사용
{} 를 활용한 방법 [] 를 사용하여 값을 추가할 수도 있음
find()
특정 키가 맵에 존재하는지 확인가능
키가 존재하면 해당 키의 이터레이터(위치)를 반환, 존재하지 않으면 map.end() 를 반환

size()
맵에 키-값 쌍의 개수를 반환하는 함수

erase(key)
맵의 특정 key를 가진 요소만 삭제

clear
맵에 있는 모든 원소를 삭제하는 함수
clear 는 맵 뿐 아니라 대부분 컨테이너에 존재

2. 알고리즘
STL은 다양한 컨테이너와 독립적으로 동작하는 범용 알고리즘을 제공
반복자 덕분에 특정 컨테이너의 내부 구현을 몰라도 동일한 방식으로 알고리즘을 적용할 수 있다는 것
(거의 동일한 문법으로 모든 알고리즘 사용이 가능)
2-1. sort
컨테이너 내부의 데이터를 정렬하는 함수
기본 타입(int, double 등)의 경우 사용자 정렬 함수 없으면 오름차순으로 정렬
사용자 정렬 함수 comp(a, b) 구현 시 알아두어야 할 것 / 사용자 정렬 함수의 반환 타입: bool
1. 현재 컨테이너에서 첫 번째 인자 a가 앞에 있는 원소를 의미
2. comp(a, b) 가
true → a와 b의 순서 유지 / false → a와 b의 순서 바꿈
sort를 활용해서 class타입 벡터를 정렬할 때는 C++에서 자동으로 대소 비교 불가능 (따로 정렬을 해줘야됨)

2-2. find
컨테이너 내부에서 특정 원소를 찾아 해당 원소의 반복자를 반환하는 함수 / find(first last, 찾을 값)
1. find(first, last) 가 탐색 대상 / first 는 포함, last 는 미포함 → last 직전까지가 대상임

2. 원소를 찾은 경우 해당 원소의 반복자를 반환
3. 원소를 찾지 못한 경우 last 반복자를 반환 → last 에 주어진 두 번째 인자를 반환
3. 반복자
반복자를 기반으로 알고리즘이 동작함
→ 컨테이너 구현 방식에 의존하지 않고(내부 구현을 몰라도) 알고리즘을 활용하는데 문제가 없었음
테이너의 요소에 대한 일관된 접근 방법을 제공함
→ 알고리즘이 특정 컨테이너의 내부 구현과 무관하게 동작할 수 있음
3-1. 순방향 반복자
앞에서부터 뒤로 순차적으로 순회하는 반복자
begin() : 컨테이너의 첫 번째 원소를 가리키는 반복자
end() : 컨테이너의 마지막 원소 다음을 가리키는 반복자
end() 를 마지막 원소 다음을 가리키도록 정한 이유
1. 일관된 반복 구조 유지
2. 탐색 실패를 쉽게 표현할 수 있음

3-2. 역방향 반복자
컨테이너의 마지막 원소부터 첫 번째 원소까지 역순으로 순회할 수 있도록 해주는 반복자
rbegin() : 컨테이너의 마지막 원소를 가리키는 역방향 반복자
rend() : 컨테이너의 첫 번쨰 원소 이전을 가리키는 역방향 반복자

'게임 개발자를 위한 C++ 문법' 카테고리의 다른 글
| 게임 개발자를 위한 C++ 문법 / 3-1 ~ 3-2 (0) | 2026.05.18 |
|---|---|
| 게임 개발자를 위한 C++ 문법 / 2-4 (0) | 2026.05.15 |
| 게임 개발자를 위한 C++ 문법 / 2-1 ~ 2-2 (0) | 2026.05.06 |
| 게임 개발자를 위한 C++ 문법 / 1-5 ~ 1-6 (0) | 2026.05.04 |
| 게임 개발자를 위한 C++ 문법 / 1-1 ~ 1-4 (0) | 2026.04.30 |