[C++] STL (Standard Template Library)표준 템플릿 라이브러리 개념

유지연·2023년 5월 24일
0

C++

목록 보기
2/7

👋 C++의 STL 개념에 대해 자세히 알아보쟈!


✏️ STL ?

✔️ C++의 STL (Standard Template Library)

STL은 Standard Template Library, 표준 템플릿 라이브러리의 약자이며 C++에서 사용할 수 있는 컨테이너 클래스와, 알고리즘을 일반화 시켜 사용할 수 있는 자료구조 등을 포함하는 라이브러리의 모음이다. 여기에서 일반화를 구현하기 위해 사용하는 것이 템플릿의 개념이다.

STL은 크게 컨테이너, 알고리즘, 반복자 총 3가지로 나눌 수 있다.

  1. 컨테이너 Container: 체계화된 방법으로 데이터를 저장하는 공간
  2. 알고리즘 Algorithm: 컨테이너에 담긴 데이터를 처리하는 방법
  3. 반복자 Iterator: 포인터 유사 개념, 컨테이너의 원소에 접근

✔️ 컨테이너 Container

같은 타입의 여러 객체를 저장하는 일종의 집합이다.
클래스 템플릿으로, 컨테이너 변수를 선언할 때 컨테이너에 포함할 요소의 타입을 명시한다.

vector<int> v;
map<string, int> m;

문제 상황에 따라 big-O가 가장 최소화되는 컨테이너를 선택하여 성능을 극대화 시킬 수 있다.

  • 컨테이너의 종류

    • 시퀀스 컨테이너 (Sequence container)
      - 데이터를 선형으로 저장하며, 특별한 제약이나 규칙이 없는 가장 일반적인 컨테이너
      - vector, deque, list, forward_list

    • 연관 컨테이너 (associative container)
      - 데이터를 일정 규칙(key, value)에 따라 조직화하여 저장하고 관리하는 컨테이너
      - key값을 이용하여 데이터에 접근
      - 자료들이 정렬되어 있음 → 삽입/삭제 시간은 오래걸리나 탐색이 빠름
      - set, multiset, map, multimap

    • 컨테이너 어댑터 (adapter container)
      - 간결함과 명료성을 위해 인터페이스를 제한한 시퀀스나 연관 컨테이너의 변형
      - stack, queue, priority_queue

✔️ 반복자 Iterator

컨테이너의 원소를 순회하는 방법을 추상화한 객체로, 포인터와 비슷하게 동작한다.
반복자를 이용하여 컨테이너 내 원소들에 접근할 수 있다.

각 타입에 ::iterator 또는 ::const_iterator를 뒤에 붙여서 사용한다.
이 때, const_iterator는 반복자가 가리키는 원소의 값을 변경하지 못한다.

vector<int>::iterator itr;
vector<int>::const_iterator citr;

STL의 모든 컨테이너는 각자의 반복자를 제공하며, 공통적으로 멤버 함수 begin()과 end()가 순차열의 시작과 끝을 가리킨다. 단 end()는 마지막 원소 한 칸 뒤의 위치값을 반환한다는 것을 주의해야 한다.

  • 반복자의 종류

    • 입력 반복자 Input Iterator
      - read 및 접근 가능, write 불가능
      - 산술 연산: ++ 만 가능
      - 비교 연산 ==, != 만 가능

    • 출력 반복자 Output Iterator
      - read 및 접근 불가능, write 가능
      - 산술 연산: ++ 만 가능
      - 비교 연산 불가능

    • 순방향 반복자 Forward Iterator
      - read, write, 접근 모두 가능
      - 산술 연산: ++ 만 가능
      - 비교 연산: ==, != 만 가능

    • 양방향 반복자 Bidirectional Iterator
      - read, write, 접근 모두 가능
      - 산술 연산: ++, -- 가능
      - 비교 연산: ==, != 만 가능
      - list, set, map은 이 반복자 지원
      - 양방향 반복자를 지원하지 않는 컨테이너는 reverse()함수 사용 불가능
      → 함수, 연산에 따라 사용할 수 있는 반복자가 정해져 있음

    • 임의접근 반복자 Random Access Iterator
      - read, write, 접근 모두 가능
      - 산술 연산: ++, --, +, -, +=, -= 가능
      - 비교 연산: ==, !=, <, >, <=, >= 가능
      - 첨자 연산자 [ ] 사용 가능 (itr[n] 은 *(itr+n)과 동일)
      - vector, deque 는 이 반복자 지원

✔️ 알고리즘 Algorithm

정렬, 삭제, 검색, 연산 등의 활동을 수행하는 작업을 정의해놓은 독립형 템플릿 함수이다.
#include algorithm이 지원하는 대표적인 함수로는 아래와 같은 것들이 있다.

  • find: 지정된 값과 같은 첫 번째 원소 리턴
  • count: 지정된 값을 가진 원소 수 리턴
  • sort: 데이터를 지정된 순서에 따라 정렬
  • swap: 한 위치의 값 순서를 다른 위치의 값 순서와 교환
  • fill: 값을 위치의 순서에 복사

C++의 STL을 계속 사용하면서도 개념은 확실하게 알지 못해서 찝찝한 마음이 있었는데, 조금이나마 정리된 것 같아서 뿌듯하다! 사실 아직 반복자나 알고리즘에 대해 100% 확실하게 이해하진 못했지만, PS 하는 과정에서 추가적으로 조금씩 채워나가려고 한다 ✏️ velog도 못 올린지 꽤 된 것 같은데... 좀 더 성실히 포스팅 해보도록 하겠당 ㅎㅎ 오늘도 내일도 파이팅 빠샤🤜

[내용 참고] https://ansohxxn.github.io/stl/chapter16-2/
https://blankspace-dev.tistory.com/348
http://www.tcpschool.com/cpp/cpp_container_intro

profile
Keep At It

0개의 댓글