STL (Standard Template Library)
C++가 제공하는 템플릿 기반 표준 라이브러리 입니다.
STL 라이브러리는 크게 STL 컨테이너와 STL 알고리즘으로 구성되어 있습니다.
- STL 컨테이너 : 클래스 템플릿으로 정의되는 일종의 컬렉션 클래스.
* 컬렉션 : 같은 종류의 데이터 모임, 즉, 같은 데이터형의 데이터를 저장하고 읽어오기 위한 자료구조 클래스를 컬렉션 클래스라고 합니다.
- STL 알고리즘 : 함수 템플릿으로 정의되는 유용한 알고리즘.
* 자주 사용하는 유용한 알고리즘들을 함수 템플릿으로 정의해 둔 것입니다.
STL은 성능이 우수하고 안전성이 검증된 라이브러리이기 때문에 프로그래머는 필요한 기능을 매번 구현하는 대신 라이브러리를 믿고 사용할 수 있기 때문에 개발 기간도 단축되고 최소한의 노력만으로 원하는 기능을 구현할 수 있게 됩니다.
STL 컨테이너
STL 컨테이너는 데이터를 보관하고 관리하기 위해서 필요한 여러가지 기능을 제공합니다.
Vector
- 동적 배열이므로 배열의 크기를 변경할 수 있다.
- 임의 접근이 가능하며, 뒤에서의 삽입이 빠르다.
- 삽입, 삭제, 탐색 O(n), 임의 원소 접근 O(1) 보장
list
- 연결리스트이므로 데이터를 순차적으로 접근하고 관리할 때 유용하다.
- 위치에 상관없이 삽입과 삭제가 빠르다.
- 삽입, 삭제 O(1), 탐색, 임의 원소 접근 O(n) 보장
deque
- 덱, 데크라고 한다.
- 임의 접근이 가능하며 앞과 뒤에서의 삽입이 빠르다.
- 삽입, 삭제, 탐색 O(1), 임의 원소 접근 O(n) 보장
map
- 특정 키(key)로 데이터를 접근하고 관리할 수 있다.
- 키로 값에 접근하며 삽입과 삭제가 빠르다.
- 삽입, 삭제, 탐색 모두 O(log n) 보장
set
- 원소들을 순서대로 관리하며 소속 검사와 삽입, 삭제가 빠르다.
- 중복된 원소를 허용하지 않는다. (map과 set의 차이점, set은 값이 곧 키가 됩니다.)
- 삽입, 삭제, 탐색 모두 O(log n) 보장
stack
- top에서만 삽입과 삭제가 가능하다.
- LIFO(Last In First Out) 방식으로 데이터를 삽입, 삭제 한다.
- 삽입, 삭제 O(1) 보장
queue
- 삽입은 뒤쪽에서, 삭제는 앞쪽에서 수행한다.
- FIFO(First In First Out) 방식으로 데이터를 삽입, 삭제한다.
- 삽입, 삭제 O(1) 보장
STL 컨테이너는 데이터를 저장하는 방식과 삽입, 정렬, 삭제하는 관리 방식에 따라 크게 세 가지 부류로 나눠볼 수 있습니다.
순차 컨테이너
- 데이터를 순차적으로 저장하는 가장 일반적인 컨테이너
- 삽입된 데이터를 저장할 때 별도의 제약이나 관리 규칙을 갖지 않는다.
- 임의의 위치에 원소를 삽입하거나 삭제할 수 있다.
- vector, list, deque 등이 속한다.
연관 컨테이너
- 데이터를 무조건 저장만 하는 것이 아니라 일정한 규칙에 따라서 데이터를 관리하는 컨테이너
- 정렬이나 해시 등의 방법을 통해 삽입되는 데이터를 항상 일정한 기준에 맞는 위치에 저장하므로 검색 속도가 빠르다.
- set, map 등이 속한다.
어댑터 컨테이너
- 순차 컨테이너를 변형하여 데이터를 미리 정해진 방식에 따라 관리한다.
- 데이터를 삽입하고 제거하는 순서가 항상 컨테이너의 규칙에 의해 결정된다.
- stack, queue, priority_queue 등이 속한다.
STL 컨테이너는 공통적으로 iterator 클래스를 제공합니다.
iterator는 반복자라고도 하는데 마치 포인터처럼 STL 컨테이너의 특정 위치를 나타내는 역할을 합니다.
- ++ 연산자를 이용해 다음 원소를 가리키도록 변경할 수 있고, * 연산자를 통해 해당 원소에 접근할 수도 있습니다.
- list.begin(), list.end()와 같은 함수를 제공하는데 begin은 컨테이너의 가장 처음, end는 컨테이너의 마지막 위치를 가리킵니다.
// 인덱스를 사용하는 방법
for(vector<Customer_list>::size_type i = 0; i != customers.size(); ++i)
{
cout<< customers[i].name <<endl;
}
// 반복자를 사용하는 방법
for(vector<Customer_list>::const_iterator iter = customers.begin();
iter != customers.end(); ++iter)
{
cout<< (*iter).name <<endl;
cout<< iter->name <<endl;
}
'Programming Language > C, C++' 카테고리의 다른 글
C++ Hash와 Map의 차이점 (0) | 2014.10.13 |
---|---|
C++와 Java의 차이점 (0) | 2014.10.13 |
C++ 템플릿 (0) | 2014.10.10 |
C 헤더파일 중복검사 (0) | 2014.10.10 |
C++ 네임스페이스 (0) | 2014.10.10 |