07
07
728x90

STL이란?

STL은 Standard Template Library의 약자로, C++의 템플릿을 사용해 표준으로 정의된 라이브러리다.

컨테이너, 반복자(iterator), 알고리즘 함수로 구성되어 있다.

즉, STL은 아래 3개 라이브러리들을 모두 가지고 있는 것이다.

- 컨테이너: 임의타입 객체를 보관하는 자료구조

- 반복자: 컨테이너에 보관된 원소에 접근할 때 사용

- 알고리즘: 반복자를 가지고 원하는 작업을 수행할 때 사용

 

오랫동안 검증된 라이브러리로, 알고리즘 문제를 풀거나 코딩테스트에서 유용하게 쓰일 수 있다.

쉽게 말하면 사람들이 자주 사용하는 필요한 기능들을 미리 만들어 모아놓은 것이라고 볼 수 있다.

 

예를 들어 일반적인 배열만 사용하다가 배열처럼 쓰이지만 동적으로 할당하고 필요할 때마다 자동으로 재 할당해주는 기능을 사용하고 싶다면 C언어에서는 기본적으로 malloc, realloc등의 함수들을 사용해 사용자가 직접 구현해서 사용한다.

하지만 C++에서는 vector를 사용하면 사용자가 자잘한 기능 구현 없이 바로 가져다 사용할 수 있는 식이며, 필요한 경우 사용자가 원하는 기능을 오버라이딩 해 사용할 수 있다.

(예를 들어 std::sort(시작주소, 끝주소) -> std::sort(시작주소, 끝주소, 비교함수)의 형태)

 

따라서 STL을 잘 활용하면 훨씬 효율적으로 코딩할 수 있게 된다.

 


컨테이너(Container)

컨테이너란 기본 자료형과 사용자가 정의한 자료형을 담는 일종의 자료구조다.

원소 저장과 접근 방식이 모두 다르며, 크게 3가지 종류로 나눠진다.

 

1. 순차 컨테이너(Sequence Container)

시퀀스는 순차적이라는 뜻을 가진 단어다.

자료를 입력한 순서대로 저장하기에 검색, 저장, 알고리즘에 사용하면 시간복잡도에 불리하게 작용한다.

따라서 적은 양의 자료나 검색속도가 중요하지 않은 경우 주로 사용한다.

예) vector, list, string, deque ...

 

2. 연관 컨테이너(Associative Container)

일정한 규칙에 따라 자료를 저장하며, 키와 값의 쌍으로 값을 보관한다.

키와 값의 쌍은 키를 바탕으로 대응되는 값을 찾는 것이다.

자료를 정렬해서 저장하기 때문에 검색에 유리하며, 많은 양의 자료를 담거나 검색속도가 중요한 경우 주로 사용한다.

예) set, map, multiset, multimap ...

 

3. 어댑터 컨테이너(Adaptor Container)

기존 순차 컨테이너와 연관 컨테이너에 저장된 데이터에 접근하는 방법을 다른 방향으로 제공한다.

기존 컨테이너의 인터페이스를 제한해 특정 형태의 동작만을 수행하도록 변형된 것이다.

반복자를 지원하지 않는다.

예) queue, priority queue stack, ...)

 


반복자(Iterator)

iterator는 반복자라고 하며, C++라이브러리가 제공한다.

이걸 사용하면 라이브러리의 방식대로 자료구조에 접근할 수 있으며, 효과적으로 컨테이너에 저장된 원소들을 탐색할 수 있다.

위에서 컨테이너의 설명에서 각 컨테이너는 원소를 저장하고 접근하는 방식이 다르다고 했다.

때문에 반복자도 이에 따라 각기 다른 방식으로 컨테이너를 탐색하며, 그렇기에 컨테이너에 따라 반복자에도 여러 종류가 있다.(임의접근 반복자, 양방향 반복자 등)

 

반복자를 사용하는 방법은 다음 vector편에서 확인 바란다.


알고리즘(Algorithm)

알고리즘은 많이 들어봐서 대충 감이 올텐데, 컨테이너 객체의 원소를 다룰 수 있는 기능들이라고 생각하면 된다.

주로 검색, 정렬 등의 기능을 수행한다.(STL 내부 객체의 함수가 지원)

쉽게 말하면 알고리즘 라이브러리로 컨테이너(벡터 등)에 반복자를 가지고 원하는 작업을 쉽게 수행하도록 도와주는 라이브러리다.

 

알고리즘 함수들은 주로 두 가지 형태로, 이는 아래와 같다.

template <typename Iter>
void do_something(Iter begin, Iter end);

template <typename Iter, typename Pred>
void do_something(Iter begin, Iter end, Pred pred);

기본적으로 첫 번째 형태를 보면 어떤 일을 수행할 때 반복자로 시작점과 끝점 바로 뒤를 받고(자세한 것은 벡터편 반복자 확인), 두 번째 형태에는 Pred라는게 들어갔는데 이는 특정한 조건을 추가 인자로 받는 것이다.

현재 포스트의 STL설명 부분에 "std::sort(시작주소, 끝주소) -> std::sort(시작주소, 끝주소, 비교함수)"부분이 있는데, 이와 같은 형태다.

이러한 특정한 조건을 서술자(Predicate)라고 부르며 보통 bool을 리턴하는 함수객체(Functor)를 전달하는 것이다.

 


마무리

2편부터는 컨테이너를 기준으로 나눠서 포스팅을 진행할 예정이다.

728x90

'개발 > C, C++' 카테고리의 다른 글

[C++] 네이밍  (0) 2022.07.08
[C++] STL 2편 - 벡터 컨테이너(vector)  (0) 2022.07.07
[C++] XOR 연산 이용 swap  (0) 2022.06.12
[C++] 참조자(Reference), 포인터와 차이점, 사용법  (0) 2022.06.10
[C++] namespace란?  (0) 2022.06.10
COMMENT