1. STL(Standard Template Library)의 등장
- C++은 표준 라이브러리를 가지고 있는다.
- 이를 이용해 직접 특정 기능을 작성하지 않고 제공되는 함수를 통해 손쉽게 기능을 구현할 수 있다.
- 그리고 1994년 7월에 C++ 표준 라이브러리에 STL이 추가되었다.
2. STL의 개념
- STL의 사전적 의미는 표준 템플릿 라이브러리다.
- 템플릿의 특징은 하나의 코드로 여러 결과를 보여준다.
- STL의 모든 코드가 템플릿으로 되어 있다.
- STL은 기본 개념은 이미 구현되어 있는 공통적인 기능을 쉽게 사용하는 것이다.
3. STL 구성 요소
STL은 크게 컨테이너, 반복자, 알고리즘, 함수자로 구성되어 있다.
3-1 컨테이너
순차 컨테이너 : 동일한 객체가 선형으로 구성된 집합. 실행 시에 동적으로 크기를 변경 가능하다.
순차 컨테이너 | 설명 |
벡터(vector) | 구성 요소에 임의로 접근할 수 있다. 집합의 끝에 삽입 및 삭제는 빠르게 처리되지만, 처음이나 중간의 삽입 및 삭제는 요소들의 개수에 따라 처리 속도가 증가한다. |
데크(deque) | 구성 요소에 임의로 접근할 수 있다. 집합의 양끝에 발생하는 삽입, 삭제를 빠르게 처리하지만, 중간의 삽입 및 삭제는 해당 위치에서 양끝까지의 개수에 따라 처리 속도가 증가한다. |
리스트(list) | 구성 요소에 선형적으로 접근한다. 집합 내의 어느 요소나 삽입과 삭제가 같은 처리 속도에 접근할 수 있다. |
정렬 연관 컨테이너 : key를 이용하여 데이터를 신속하게 찾아낸다. 실행 시 동적으로 변경할 수 있다.
정렬 연관 컨테이너 | 설명 |
셋(set) | 집합에는 키만 저장할 수 있다. 키는 중복을 허용하지 않으므로, 원하는 키를 빠르게 찾을 수 있다. |
멀티셋(multiset) | 셋과의 차이는 중복을 허용한다. 2개 이상의 복사본을 가진다. |
맵(map) | 집합에 키와 데이터를 같이 관리한다. 키는 중복을 허용하지 않고, 키를 이용하여 객체를 빠르게 찾아낸다. |
멀티맵(multimap) | 키의 중복을 허용한다. 2개 이상의 복사본을 가진다. |
3-2 반복자
- 컨테이너의 요소로를 가리키는 객체로, 컨테이너의 시작 끝을 이동하며 요소를 읽거나 쓸 때 사용한다.
- 입력(input) : 입력 반복자는 읽기 전용
- 출력(output) : 출력 반복자는 쓰기 전용
- 순방향(forward) : 한쪽 방향으로 순회 (입력, 출력 반복자 기능 모두 포함)
- 양방향(bidrectional) : 양방향으로 순회 (순방향 기능 모두 포함)
- 임의접근(random access) : 컨테이너의 모든 요소에 접근 소요시간이 동일 (양방향 기능 모두 포함)
3-3 알고리즘
1. 변경 불가 순차 알고리즘
2. 변경 가능 순차 알고리즘
3. 순차 관련 알고리즘
4. 범용 수치 알고리즘
3-4 함수자
- 함수 객체로도 불리며, 0개 이상의 인자를 받아서 알고리즘의 기본 동작을 변형하거나 확장시켜주는 객체다.
- 산술 연산, 비교 연산, 논리 연산에 대한 함수자들을 제공한다.
- 산술 연산 함수자 : +, - , * /
- 비교 연산 함수자 : ==, !=, >, <, >=, <=
- 논리 연산 함수자 : &&, ||, !
4. STL의 장점
- 일반화를 지원한다. 하나의 단일 알고리즘으로 여러 개의 컨테이너에 대해 동일한 작업이 가능하다.
- 컴파일 타임의 매커니즘을 지원하므로 실행 시 효율의 저하가 거의 없다.
- 객체 지향적이지 않다. 함수는 모두 전역 변수를 사용하고, 상속을 거의 하지 않는다.
- 성능이 중요하므로 가상 함수와 같은 저성능 매커니즘을 사용하지 않는다.
- 표준이므로 이식성이 좋다.
- 소스 공개로 확장성이 좋다.
5. STL의 단점
- 템플릿 기반으로 함수와 클래스가 매번 구체화되어 소스가 커진다.
- 가독성이 떨어진다.
- 예외 처리가 어렵다.
참고문헌
C++ 프로그래밍과 STL / 이창현 지음
'C++' 카테고리의 다른 글
[C++] 정렬되지 않은 벡터(vector) O(1)시간으로 요소 삭제하기 (0) | 2022.06.15 |
---|---|
[C++] Pair 개념, 활용, 선언, 초기화, 대소 비교 (0) | 2022.06.13 |
[C++] 연산자 오버로딩의 개념, 활용, 주의점 (0) | 2022.06.07 |
[C++] C++과 JAVA의 차이점과 각 언어의 장단점 (0) | 2022.06.06 |
[C++] 인라인 함수의 장단점, #define 매크로와 차이 (0) | 2022.06.03 |