2014. 10. 10. 19:12

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;
}




STL 컨테이너 장점

STL 컨테이너의 종류가 다르더라도 컨테이너가 제공하는 인터페이스가 같다는 점

 - 특정 컨테이너에서 사용되었던 push_back, back, begin, end 등의 멤버 함수는 모든 컨테이너에서 똑같이 적용됩니다.

 - 따라서 유지보수 단계에서 성능이나 구현상의 이유로 다른 컨테이너를 사용하도록 수정하더라도 프로그램 변경이 최소화 됩니다.



STL 알고리즘

STL 알고리즘은 STL이 제공하는 범용 함수를 말합니다.

 - 정렬이나 검색처럼 프로그램 구현에 자주 사용되는 기능을 함수 템플릿으로 준비해둔 것입니다.


binary_search

 - 정렬되어 있는 범위 내의 원소에서 이진 검색을 수행한다.

find

 - 범위 내에서 특정 값을 갖는 원소를 검색한다.

for_each

 - 주어진 범위 내에서 각 원소에 대해 함수 객체를 적용한다.

max

 - 두 객체 중 큰 값을 구한다.

min

 - 두 객체 중 작은 값을 구한다.

remove

 - 범위 내에서 특정 값을 갖는 원소를 제거한다.

replace

 - 범위 내에서 특정 값을 갖는 원소를 찾아 값을 변경한다.

sort

 - 범위 내의 값을 오름차순으로 정렬한다.


STL 알고리즘은 STL 컨테이너에 적용되어 STL 컨테이너의 원소 중 특정 범위 내의 원소에 대하여 정해진 동작을 수행합니다.

 - 보통은 STL 컨테이너의 첫번째 위치부터 마지막 위치에 대해 필요한 적업을 수행하는데 이때도 컨테이너의 원소 범위를 지정하는데 iterator를 이용합니다.


STL 알고리즘과 STL 컨테이너를 충분히 활용하려면 각각에 대해 좀 더 자세히 공부할 필요가 있습니다.

저도 아직 많이 익숙하지 못해서 제대로 못써먹기도 하는데 앞으로는 적극적으로 활용해보려 합니다~


'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
Posted by 긍정왕오킹