C++

STL

왕건 2026. 3. 24. 20:26

챕터 2-3 : STL 기초

오늘은 STL 기초를 정리했다.

처음에는 vector, map, sort, find, iterator가 한 번에 나와서 좀 많아 보였는데
가만히 보면 결국 데이터를 저장하고, 찾고, 정렬하고, 순회하는 방법들이다.

따로따로 외우기보다
어떻게 연결해서 쓰는지 보는 게 더 중요한 것 같다.


STL

STL은 Standard Template Library 이다.

크게 보면

  1. 컨테이너
  2. 알고리즘
  3. 반복자

이렇게 나뉜다.

컨테이너는 데이터를 담고
알고리즘은 데이터를 처리하고
반복자는 그 데이터에 접근하게 해준다.

결국 셋이 같이 움직인다.


vector

vector는 동적 배열이다.

배열처럼 순서대로 저장되는데
필요하면 크기를 늘릴 수 있다는 점이 제일 편하다.

그래서 여러 값을 저장할 때 기본처럼 많이 쓴다.

가장 많이 쓰는 건

  • push_back()
  • begin()
  • end()

이 정도인 것 같다.

push_back()은 맨 뒤에 값을 추가하는 함수다.

배열은 크기가 고정인데
벡터는 뒤에 계속 붙일 수 있어서 훨씬 낫다.


map

map은 key 와 value 를 같이 저장하는 컨테이너이다.


하나의 값을 기준으로 다른 값을 찾는 구조다.

예를 들면

  • 번호 : 이름
  • 아이디 : 점수
  • 과일 이름 : 가격

이런 느낌이다.

여기서 중요한 건

  • first 는 key
  • second 는 value

라는 점이다.

처음 보면 pair.first, pair.second가 어색한데
map 원소 하나가 key-value 쌍이라고 생각하면 이해가 된다.


map의 특징

map은 그냥 저장만 하는 게 아니라
key 기준으로 자동 정렬된다.

이게 꽤 중요하다.

예를 들어 20, 5, 15, 10 순서로 넣어도
출력할 때는 5, 10, 15, 20 순서로 나온다.

즉 넣은 순서대로 보관되는 게 아니라
정렬된 상태를 유지하는 구조다.

그래서 순서가 중요하면 다른 컨테이너를 봐야 하고
key 기준 관리가 중요하면 map이 편하다.


map에 값 넣기

값 넣는 방식은 여러 가지가 있다.

  • []
  • insert()
  • make_pair()

처음에는 []가 제일 보기 편했다.

직관적이라서
처음 map 익힐 때는 이 방식부터 쓰는 게 제일 무난한 것 같다.


map의 find()

find()는 특정 key를 찾을 때 사용한다.

여기서 중요한 건
찾으면 true/false를 주는 게 아니라
iterator를 반환한다는 점이다.

  • 찾으면 그 위치 반환
  • 못 찾으면 end() 반환

이다.

그래서 보통은

it != myMap.end()

이렇게 비교해서 찾았는지 확인한다.

처음에는 왜 이렇게 하지 싶었는데
찾은 뒤에 바로 key랑 value를 쓸 수 있어서 오히려 편하다.


sort()

sort()는 정렬할 때 쓴다.

기본은 오름차순이다.

벡터든 배열이든
범위를 넘겨주면 정렬된다.

여기서 중요한 건
정렬할 구간을 반복자로 넘긴다는 점이다.

  • 어디서부터
  • 어디까지

를 정해서 정렬하는 방식이다.

그리고 비교 함수를 주면
내림차순이나 원하는 기준으로도 정렬할 수 있다.

정렬 기준을 직접 만든다는 점이 생각보다 강력하다.


find()

find()는 특정 값을 찾는 알고리즘이다.

이건 map에서 쓰는 find()랑 느낌은 비슷하지만
좀 더 범용적이다.

벡터, 배열, 문자열에서도 쓸 수 있다.

형태는 결국

시작 위치, 끝 위치, 찾을 값

이렇게 본다.

STL이 편한 이유가 여기서 보인다.

컨테이너가 달라도
사용 방식이 거의 비슷하다.


iterator

반복자는 아직도 제일 낯설다.

그런데 STL에서는 진짜 중요하다.

반복자는 컨테이너 원소를 가리키는 도구이다.

배열의 인덱스랑 비슷하게 느껴지기도 하지만
완전히 같은 건 아니다.

인덱스처럼 숫자로 접근하는 게 아니라
원소의 위치를 가리킨다고 보는 게 더 맞는 것 같다.


begin() 과 end()

여기서 자주 나오는 게 begin() 이랑 end() 이다.

  • begin() : 첫 번째 원소
  • end() : 마지막 원소의 다음 위치

처음에는 왜 마지막 원소가 아니라 다음 위치인지 헷갈렸는데
반복문 돌릴 때는 이게 훨씬 깔끔하다.

끝까지 갔는지 판단하기도 쉽고
못 찾았을 때도 end()로 표현할 수 있어서 편하다.


*it

반복자에서 제일 헷갈렸던 건 *it 이었다.

it는 값 자체가 아니라
값을 가리키는 반복자이다.

그래서 실제 값을 쓰려면
앞에 *를 붙여서 꺼내야 한다.

  • it : 위치
  • *it : 그 위치에 있는 값

이렇게 보면 된다.

그래서 짝수 판별도 it % 2가 아니라
*it % 2로 해야 한다.


순방향 반복자

순방향 반복자는 앞에서 뒤로 간다.

begin()에서 시작해서
end() 전까지 이동한다.

벡터 순회할 때 가장 기본이 되는 방식이다.

값을 하나씩 보면서
조건을 검사하거나 출력할 때 많이 쓴다.


역방향 반복자

역방향 반복자는 뒤에서 앞으로 간다.

여기서는

  • rbegin()
  • rend()

를 쓴다.

즉 마지막 원소부터 시작해서
앞으로 이동하는 방식이다.

앞에서부터 보는 거랑 구조는 비슷한데
방향만 반대라고 보면 된다.

이 부분까지 보니까 반복자가 조금 덜 추상적으로 느껴졌다.


오늘 정리

오늘 배운 걸 짧게 정리하면

  • vector : 동적 배열
  • map : key-value 저장
  • map : key 기준 자동 정렬
  • sort() : 정렬
  • find() : 탐색
  • iterator : 원소를 가리키는 도구
  • begin(), end() : 순방향
  • rbegin(), rend() : 역방향

결국 STL은 각각 따로 외우는 게 아니라
같이 묶어서 보는 게 맞는 것 같다.

벡터에 저장하고
정렬하고
찾고
반복자로 순회하는 흐름이 계속 반복된다.


마무리

오늘 STL 기초를 보면서 느낀 건
처음엔 문법이 많아 보이는데
막상 패턴은 비슷하다는 점이다.

그래서 하나하나 따로 보기보다
전체 흐름으로 익히는 게 더 중요해 보인다.

다음에는 auto, auto&, const auto& 차이랑
it->first, it->second도 더 익숙해져야겠다.

'C++' 카테고리의 다른 글

2026-6-2 코드카타  (0) 2026.06.02
2026-6-1 코드카타  (0) 2026.06.01
기본 생성자와 오버로딩  (0) 2026.03.12
생성자와 소멸자  (0) 2026.03.12
C++로 전직 시스템과 전투 시스템 구현해보기  (0) 2026.03.10