게임 개발자를 위한 C++ 문법

게임 개발자를 위한 C++ 문법 / 2-3

jh009 2026. 5. 13. 10:22

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() :  컨테이너의 첫 번쨰 원소 이전을 가리키는 역방향 반복자