C++/STL

C++ STL 정리 - 개요

728x90

간단하게 C++ STL 의 종류와 특성에 대해서 훑어보는 포스팅이다.

 

STL 은 Standard Template Library 의 약자로 C++ 언어를 위한 4가지 구성요소를 제공하는 라이브러리다.

 

4가지 구성요소는 

Algorithm, Container, Iterator, Functors가 해당한다.

 

 

* Algorithm

Algorithm 은 Algorithm 이라는 헤더 파일에 정의되어 있으며, 

Container 를 다루기 위한 여러 수단을 제공한다.

 

예를 들면,

Container 를 정렬 하기 위해 쓰는 sort() 함수나,

이진 탐색을 위해서 쓰이는 binary_search() 함수나,

Container 내부의 값을 찾는 find() 함수 등 다양하게 존재한다

자세한 함수 종류는 Reference 첫번째 문서를 참조 바란다.

 

 

* Container

Container 는 4가지 종류로 나뉠 수 있는데,

 

 

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

 

Sequence Container 는 선형 방식으로 동일한 타입의 데이터를 저장하기에 알맞은 자료구조가 해당한다.

이에 해당하는 타입은 아래와 같이 5개가 있다.

 

-array 

-vector

-forwarded_list (singly-linked list)

-list (doubly-linked list)

-deque (double-ended queue)

 

 

 

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

 

Associative Container 는 정렬된 데이터 구조를 제공하며, 빠른 탐색이 가능한게 특징인 자료구조이다.

이에 해당하는 타입은 아래와 같이 4가지가 존재한다.

 

- Key 가 unique 한 경우

: set, map

 

- Key 가 하나이지만 중복된 value 가 허용되는 경우

: multiset, multimap

 

Associative Container 의 경우 컨테이너를 정의할 때, 별도의 정렬 방식을 정의해 줄 수 있다.

예를 들면, 아래의 코드는 class set 에 대한 기본정의 인데,

template<class Key, class Compare = std::less<Key>class Allocator = std::allocator<Key>> class set;
cs

 

비교 값은 Key 로 비교를 하고, 비교/정렬에 대한 방법은 std::less 를 사용하며, 할당을 key 값으로 정의하는 것을 알 수 있다.

 

(std::less, std::greater 는 #include <functional> 에 정의된 함수로, less(a,b) 하면 a 가 b 보다 작을 때, true 를 리턴, greater(a,b) 하면 a 가 b 보다 클때, true 를 리턴한다.

그래서 less 를 사용해서 컨테이너를 정의하면 오름 차순 컨테이너 생성이 가능하고,

greater 를 사용해서 컨테이너를 정의하면 내림 차순 컨테이너 생성이 가능하다.)

 

 

 

- 3) Unordered Associative Container (비정렬 연관 컨테이너)

 

Unordered Associative Container 이 컨테이너들은 해시화가 된 key 를 기반으로 자료에 접근하는 것이 특징이다.

이 경우도 Associative Container 와 유사하게 두 종류로 나뉜다

 

- Key 가 unique 한 경우

: unordered_set, unordered_map

 

- Key 가 하나이지만 중복된 value 가 허용되는 경우

: unordered_multiset, unordered_multimap

 

* 위에서 언급한 "Key 가 하나이지만 중복된 value 가 허용되는 경우" 란 컨테이너의 이름을 보면 추측이 가능하지만, 동일한 키에 여러개의 값이 들어 갈 수 있다는 의미이다. 예를들면 DB 에서 주민등록번호는 Unique Key, Primary Key 로 칠 수 있지만, 이름은 그렇지 않다. 이름이 바로 value 가 중복되어 허용되는 경우라 볼 수 있다.

 

 

- 4) Container Adapters

이 컨테이너들은 그 자체적으로 완전한 컨테이너 클래스는 아니고 다른 컨테이너를 겸용해서 정의된 경우이다.

이 말이 무슨 말인고 하면, stack 에 대한 정의를 보면 

template<class T, class Container = std::deque<T>> class stack;
cs

 

으로 정의가 되어 있는데, 다른 컨테이너 정의에 비해서 deque 라는 다른 요소를 끼고 정의 되었음을 의미한다.

물론 이 deque  대신에 다른 것을 override 하여 바꿀 수 있다고 한다.

(단 두가지 조건이 따르는데, 1. Sequence Container 의 형태여야 하며, 2. back(), push_back(), pop_back() 인터페이스를 제공해야만 한다)

 

여기에 해당하는 컨테이너들은

stack, queue, priority_queue 가 해당한다.

 

 

* Iterator

Iterator (반복자) 의 경우 주로, 컨테이너를 탐색, 순회 할 때 자주 사용되는 인터페이스다.

다음과 같은 종류의 Iterator 가 존재한다.

 

- Input Iterator

-> 현재 위치의 원소를 단 한번만 읽을 수 있는 반복자 (istream)

 

- Output Iterator

-> 현재 위치의 원소를 단 한번만 쓸 수 있는 반복자 (ostream)

 

- Forward Iterator

-> 입력, 출력 반복자 기능에 순방향으로 이동(++)이 가능한 재할당될 수 있는 반복자

 

- Bidirectional Iterator

->순방향 반복자 기능에 역방향으로 이동(--)이 가능한 반복자  (list, set, mulitset, map, multimap)

 

- Random Access Iterator

-> 양방향 반복자 기능에 +, -, += , -=, [] 연산이 가능한 반복자
 (vector, deque)

 

Iterator 에 대한 더 자세한 사항은 Reference 의 세번째 문서를 참조 바란다.

 

 

* Functors

Functor 란 객체를 마치 함수처럼 쓰게 만드는 것으로,

Function Object 라고도 불린다.

이에 대한 더 자세한 설명은 Reference 의 4,5 번째 문서를 참조 바란다.

 

 

- Reference

1. http://www.cplusplus.com/reference/algorithm/

2. https://embeddedartistry.com/blog/2017/08/02/an-overview-of-c-stl-containers/

3. https://en.cppreference.com/w/cpp/iterator

4. https://haedallog.tistory.com/85

5. https://en.cppreference.com/w/cpp/utility/functional

 

 

728x90

'C++ > STL' 카테고리의 다른 글

C++ STL 정리 - 정렬  (0) 2020.11.15
C++ STL 정리 - Stack  (0) 2020.09.27
C++ STL 정리 - Map  (0) 2020.09.10
C++ STL 정리 - Set  (0) 2020.09.07
C++ STL 정리 - Vector  (0) 2020.08.28