[부트캠프] C++ - STL(표준 템플릿 라이브러리)

Claire·2024년 9월 5일

STL(Standard Template Library)

STL이란

표준 템플릿 라이브러리(Standard Template Library)

기능을 제공하고 손쉽게 구현하며, 재사용을 하기 위한 목적의 언어들은 누구나 공통적으로 사용하기 위한 일반화 프로그래밍이 기반의 템플릿을 사용하는데, 그 안에서 무분별한 여러 형태의 코드를 지양하고 표준화된 코드를 지향하는 것이 STL(표준 템플릿 라이브러리)이다.

STL의 성능

  • 템플릿 기반이라고 해서 느릴것이라는 편견이 있으나, 전반적으로 성능명에서는 어떤 라이브러리에 비해 전혀 떨어지지 않는다.
  • 각 자료구조마다 사용 용도에 따른 성능의 차이를 보이는데, 자료의 검색, 정렬, 삽입, 삭제에 최적화된 자료구조를 취사선택해서 사용하면 된다.

STL의 구성요소

컨테이너

사전적으로 무언가를 담는 '용기'를 의미하는데, 즉, 배열처럼 동일한 내용들로 구성된 요소를 담는 공간을 의미하는 템플릿 기반의 라이브러리

컨테이너는 크게 순차 컨테이너(Sequence Container)와 정렬 연관 컨테이너(Sorted Associactive Container)로 나눌 수 있고 세부적으로는 순차 컨테이너, 컨테이너 어댑터, 정렬 연관 컨테이너, 정렬되지 않은 연관 컨테이너로 총 4가지 유형이 있다.

순차 컨테이너(Sequence Container)
: 동일한 객체가 선형으로 구성된 집합으로 백터, 데크, 리스트 이렇게 총 3가지가 있다.

  • 벡터(vector): 구성 요소에 임의 접근이 가능하며, 요소 끝에 삽입/삭제는 빠르지만 처음이나 중간 삽입/삭제는 요소 개수에 따라 처리 속도가 비례한다.
  • 데크(deque): 백터와 비슷하나 요소 양끝에 삽입/삭제가 가능하다는 점에서 차이가 있다. 성능 또한 벡터와 같이 요소 개수에 따라 처리 속도가 비례한다.
  • 리스트(list): 구성 요소에 선형적으로 접근하며, 요소에 삽입과 삭제가 위치에 상관없이 같은 속도로 처리한다. 즉, 각각의 데이터들이 포인터로 연결되어 있다는 것을 의미한다.

정렬 연관 컨테이너(Sorted Associactive Container)
: 키(key)와 값(value)형태로 짝을 이룬 데이터(예: JSON 파일 등)를 삽입된 순서가 아닌 키 값을 기준으로 정렬해서 자료를 보관하는 컨테이너로 순차 컨테이너와 마찬가지로 실행 시 크기를 동적으로 변경할 수 있다.

편의점으로 예를 들어보면, 키는 편의점의 바코드이고, 값은 그 바코드에 들어있는 가격이라고 할 수 있다.
따라서, (진열이 되어 있지 않다는 전제하에) 바코드를 찍기 전까지는 상품의 가격을 확인할 수 없고 가격이라고 하는 value에 접근 하기 위해서는 바코드라고 하는 key가 필요한 것이다.

  • 셋(Set): 집합에는 키만 저장할 수 있는데, 키의 중복은 허용하지 않으므로 동일한 키가 2개 존재할 수 없으며, 원하는 키를 신속하고 빠르게 찾아낸다.
  • 멀티셋(Multiset): 셋과의 차이라면 키의 중복을 허용한다는 점이다. 따라서 2개 이상의 복사본을 가질 수 있다.
  • 맵(Map): 집합에 키와 데이터를 같이 관리하는데, 키의 중복은 허용하지 않으므로 동일한 키가 2개 존재할 수 없으며 키를 사용하여 원하는 객체를 빠르게 찾아낸다.
  • 멀티맵(Multimap):맵과의 차이라면 키의 중복을 허용한다는 점이다. 따라서 2개 이상의 복사본을 가질 수 있다.

반복자

컨테이너의 "요소를 가리키는 객체(=iterator)"로 컨테이너의 시작부터 끝까지 이동하면서 요소를 읽거나 쓰기 위해 사용

컴파일러의 내부 알고리즘은 컴파일러 제작 회사마다 조금씩 다르며, 반복자의 제한적 규정을 통해 각기 다른 컨테이너의 성능을 보장하도록 했다.

알고리즘

정렬, 검색하는 방법같은 유용한 생각들을 정리해놓은 함수들로, 알로기즘은 모두 일반적이기 때문에 하나의 컨테이너에 종속되지 않고 여러 컨테이너에서 사용이 가능하다.

STL 사용의 장/단점

장점
1. 범용적, 공통적으로 사용할 수 있도록 일반화를 지원한다. 즉, 누구나 다 사용할 수 있도록 제공한다.
2. 컴파일 타입의 매커니즘을 사용하므로 실행 시 효율의 저하가 거의 없다.
3. 표준이므로 이식성이 좋다.
4. 소스 공개로 확장성이 좋다.

단점
1. 템플릿기반이므로 함수와 클래스가 매번 구체화되어 소스가 비대해진다.
2. 가독성이 떨어진다. 템플릿 기반 코드이므로 입문하기가 쉽지 않다.
3. 예외 처리 적용이 쉽지 않다.

profile
SEO 최적화 마크업 개발자입니다.

0개의 댓글