C++ 표준 라이브러리

C++ 프로그래밍 언어에서, **C++ 표준 라이브러리** (C++ Standard Library)는 C++과 C++ ISO 표준 자체로 쓰여진 클래스들과 함수들의 집합이다. C++ 표준 라이브러리는 여러 제네릭 컨테이너들, 그리고 이러한 컨테이너들과 함수 객체, 제네릭 문자열, 스트림(인터렉티브와 파일 입출력을 포함하는), 몇몇 언어 특징 그리고 숫자의 제곱근을 찾는 것 같은 작업을 위한 모든 함수들을 활용하기 위한 함수들을 제공한다. C++ 표준 라이브러리는 또한 ".h"로 끝나는 ISO C90 C 표준 라이브러리의 18 헤더들을 포함하지만 이것들의 사용은 추천되지 않는다. ".h"로 끝나지 않는 헤더는 C++ 표준 라이브러리에는 존재하지 않는다. C++ 표준 라이브러리의 특징은 `std` 이름공간 (namespace) 내에 선언된다는 것이다.

C++ 표준 라이브러리는 표준 템플릿 라이브러리(STL : Standard Template Library)에 의해 도입된 관습에 기반하며, 제네릭 프로그래밍과 STL의 개발자들의 연구에 영향을 받았다. 비록 C++ 표준 라이브러리와 STL이 많은 특징들을 공유하지만, 둘 중 어느것도 다른 하나의 상위 집합은 아니다.

C++ 표준 라이브러리의 주목할 만한 특징은 이것이 단지 제네릭 알고리즘의 구문과 의미를 명시하는 것이 아니라 이것들의 성능의 요구에 가치를 두었다는 것이다. 이러한 성능 요구 사항들은 종종 잘 알려진 알고리즘과 상응하는데, 이것은 기대되지만 사용되기 위해 요구되지는 않는다. 대부분의 경우에 이것은 선형 시간 O(*n*) 또는 선형 로그형 시간 O(*n* log *n*)를 요구하지만, 어떤 경우에는 안정 정렬을 위해 준선형 시간 O(*n* log2 *n*) 같은 높은 수준도 허용된다. 이전의 정렬은 실질적으로 빠른 퀵 정렬의 사용을 허락하며 단지 평균적으로 O(*n* log *n*)를 요구하였지만, 인트로 정렬이 빠른 평균 성능과 최악의 상황 복잡도 최적화 모두를 위해 도입되었으며, C++11에서는 정렬이 최악의 경우라도 선형 로그적으로 보장되었다. 다른 경우에 요구 사항들은 퀵 선택의 경웨 단지 평균적으로 선형 시간을 요구하는 선택 알고리즘 같이 느슨한 상태로 남아 있으며, 인트로 선택의 경우 최악의 경우에도 선형임을 요구하지 않는다.

C++ 표준 라이브러리는 C++ ISO 표준화 노력의 일환으로 ISO 표준화를 지나왔으며, 확장된 기능의 표준화를 다루는 다른 작업을 진행하고 있다.

## 표준 헤더
다음의 파일들은 C++ 표준 라이브러리의 선언들을 포함하고 있다.

### 컨테이너
; 
: C++11과 TR1에서 새로 추가되었다. 고정 크기 배열을 위한 컨테이너인 `std::array` 컨테이너 클래스 템플릿을 제공한다.
; 
: 비트 배열인 특수화된 `std::bitset` 컨테이너 클래스를 제공한다.
; 
: 덱인 `std::deque` 컨테이너 클래스 템플릿을 제공한다.
; 
: C++11과 TR1에서 새로 추가되었다. 단일 연결 리스트인 `std::forward_list` 컨테이너 클래스 템플릿을 제공한다.
; 
: 이중 연결 리스트인 `std::list` 컨테이너 클래스 템플릿을 제공한다.
; 
: 연관 배열과 멀티맵인 `std::map` 와 `std::multimap` 컨테이너 클래스 템플릿을 제공한다.
; 
: 단일 큐인 `std::queue`, 그리고 우선순위 큐인 `std::priority_queue` 컨테이너 어댑터 클래스를 제공한다.
; 
: 정렬된 연관 컨테이너 또는 집합인 `std::set` 와 `std::multiset` 컨테이너 클래스 템플릿을 제공한다.
; 
: 스택인 `std::stack` 컨테이너 어댑터 클래스를 제공한다.
; 
: C++11과 TR1에서 새로 추가되었다. 해시 테이블인 `std::unordered_map`와 `std::unordered_multimap` 컨테이너 클래스 템플릿을 제공한다.
; 
: C++11과 TR1에서 새로 추가되었다. `std::unordered_set` 와 `std::unordered_multiset` 컨테이너 클래스 템플릿을 제공한다.
; 
: 동적 배열인 `[[벡터 (STL)|std::vector]]` 컨테이너 클래스 템플릿을 제공한다.

### 일반
; 
: 많은 컨테이너 알고리즘의 정의를 제공한다.

; 
: `std::chrono::duration`, `std::chrono::time_point` 그리고 시계 같은 시간 요소를 제공한다.

; 
: 표준 알고리즘들과 함께 사용되는 목적으로 설계된 여러 함수 객체들을 제공한다.
; 
: 반복자(iterator)들과 함께 사용되는 클래스와 템플릿을 제공한다.

; 
: C++에서 클래스 템플릿 `std::unique_ptr`를 포함한 메모리 관리를 위한 기능들을 제공한다.
; 
: `std::logic_error` 와 `std::runtime_error` (둘 다 `std::exception`를 상속한다.) 같은 표준 예외 클래스들을 포함한다.
; 
: C++11과 TR1에서 새로 추가되었다. 튜플인 클래스 템플릿 `std::tuple`를 제공한다.
; 
: 객체 쌍들(2 멤버 튜플들)과 함께 동작하기 위한 템플릿 클래스 `std::pair`, 간단한 연산자 오버로딩을 위한 이름공간 `std::rel_ops`를 제공한다.

### 지역화
; 
: 로케일에 따른 특유한 정보를 캡슐화하고 조작하는 클래스들을 정의하고 함수들을 선언한다.
; 
: 다양한 문자 인코딩들을 위한 코드 전환 측면을 제공한다.

### 문자열
; 
: C++ 표준 문자열 클래스와 템플릿들을 제공한다.
; 
: C++11과 TR1에서 새로 추가되었다. 정규 표현식을 사용하여 문자열 패턴 매칭을 위한 유틸리티들을 제공한다.

### 스트림과 입출력
; 
: 파일 기반 입력과 출력을 위한 기능을 제공한다. fstream을 보자.
; 
: 정수와 부동소수점 값의 유효숫자를 포맷팅할 때 사용되는 베이스 같은 출력 포맷 조작을 위한 기능을 제공한다.
; 
: iostream의 동작을 위한 여러 타입과 함수들의 기본을 제공한다.
; 
: 여러 입출력 관련 클래스 템플릿들의 선행선언을 제공한다.
; 
: C++ 입출력 기본을 제공한다. iostream을 보자.
; 
: 템플릿 클래스 `std::istream`와 다른 입력을 위한 지원 클래스들을 제공한다.
; 
: 템플릿 클래스 `std::ostream`와 다른 출력을 위한 지원 클래스들을 제공한다.
; 
: 템플릿 클래스 `std::stringstream`와 다른 문자열 조작을 위한 지원 클래스들을 제공한다.
; 
: 외부 파일이나 문자열 같은 특정한 타입의 문자들로 또는 문자들로부터 읽고 쓰는 기능을 제공한다.

### 언어 지원
; 
: 표준 라이브러리에 의해 던져진 모든 예외들의 기본 클래스인 `std::exception`를 포함한 예외 처리와 관련된 여러 타입들과 함수들을 제공한다.
; 
: 기본 수치 타입들의 속성들을 만드는데 사용되는 템플릿 클래스 `std::numeric_limits`를 제공한다
; 
: 연산자 `new`와 `delete` 그리고 C++ 메모리 관리의 기본을 구성하는 다른 함수들과 타입들을 제공한다.
; 
: C++ 런타임 타입 정보와 함께 동작하기 위한 기능들을 제공한다.

### 스레드 지원 라이브러리
; 
: C++11과 TR1에서 새로 추가되었다. 스레드와 동작하기 위한 클래스와 이름공간을 제공한다.
; 
: C++11과 TR1에서 새로 추가되었다. 30.4-1 이 섹션은 상호 배제 메커니즘을 제공한다: 뮤텍스 락 등.
; 
: C++11에서 새로 추가되었다. 30.5-1 상태 변수들은 다른 스레드에 의해 통지되기 전까지 스레드를 막기 위해 사용되는 동기화를 제공한다.
; 
: C++11에서 새로 추가되었다. 30.6.1-1은 C++ 프로그램이 한 스레드의 함수에서의 결과를 검색하기 위해 사용될 수 있는 구성 요소들을 제공한다.

### 수치(Numerics) 라이브러리
C++ 프로그램들이 준-수치 연산들을 수행하기 위해 사용할 수 있는 구성 요소들.
; 
: 헤더 는 클래스 템플릿과 복잡한 숫자들을 표현하고 다루기 위한 많은 함수들을 정의한다
; 
: (슈도)랜덤 숫자들을 생성하기 위한 기능
; 
: 5개의 클래스 템플릿(valarray, slice_array, gslice_array, mask_array 그리고 indirect_array), 두 클래스(slice와 gslice), 그리고 값들의 배열들을 표현하고 조작하는데 사용되는 관련된 함수들을 정의한다.
; 
: 일반화된 수치 연산들.

### C 표준 라이브러리
C 표준 라이브러리의 각 헤더들은 C++ 표준 라이브러리에서 다른 이름으로, .h를 제거하고 처음에 'c'를 추가한 상태로 생성된 채 포함된다; 예를 들면 'time.h'는 'ctime'이 된다. 이러한 헤더들과 전통적인 C 표준 라이브러리 헤더들의 유일한 차이점은 std:: 이름 공간의 어디에 함수들이 위치할 수 있느냐이다. ISO C에서, 표준 라이브러리에 존재하는 함수들은 매크로에 의해 구현될 수 있지만 ISO C++에서는 허락되지 않는다.

## 같이 보기
* 아파치 C++ 표준 라이브러리
* Boost
* C POSIX 라이브러리
* C 표준 라이브러리
* 표준 라이브러리
* C++ 기술 보고서 1

## 각주

* Bjarne Stroustrup: *[[C++ 프로그래밍 언어 (책)|The C++ Programming Language]]*, Addison-Wesley, ISBN 0-201-70073-5

## 외부 링크
* Standard C++ Library reference
* [Microsoft MSDN Library - Standard C++ Library Reference](http://msdn2.microsoft.com/en-us/library/cscc687y(VS.80).aspx)
* SourcePro C++ Documentation
* STLport
* The GNU Standard C++ Library
* LLVM/Clang C++ Standard Library

분류:C++ 표준 라이브러리