1. STL??

지환·2022년 8월 27일
0

The reason for using the standard library algorithms is not to get better efficiency, it is to allow you to think at a higher level of abstraction.
링크

이미 만들어져있는 STL은, 본인이 개발하는 프로그램에 특화된 자료구조/알고리즘에 비해 당연히 느릴 것이다.
일반화/추상화를 할수록 사용하기엔 편해지지만, 그만큼 효율/속도는 떨어진다. 하지만 속도만이 중요한건 아니다, 편리함/추상화도 중요하다. 상황에 맞게 편리함과 속도 사이의 비율을 잘 조정하는 것이 맞다고 생각한다.

일반화의 편리함과 특수화의 공간/속도 효율성 사이 상황에 맞게 잘 가야될듯. 물론 효율뽑는게 더 어려울거 같긴하네.
https://www.youtube.com/watch?v=SitesHL-fAY : 실제 북미쪽 게임업계에서 STL은 금기사항이었다고 함.
뭐 STL도 C++의 한 요소니까 (그리고 실제로 매우 편리하니까) 공부할건데, 위 같은 시선도 알고는 있으면 좋을듯.

구성요소

  1. Containers
    1-1. Sequence containers
    1-2. Container adaptors
    1-3. Associative containers
    1-4. Unordered associative containers

  2. Iterators

  3. Algorithms

  4. Functors

위 4가지 요소로 나뉜다. 위 네 요소가 긴밀하게 상호작용하며 우리가 원하는 기능을 구현한다.
STL이라는 이름에 서 알 수 있듯이 대게는 type genric을 위해 template으로 구현된다.

Containers는 말 그대로 특정 자료를 담는 것이다.
Iterators는 Containers과 Algorithms 사이를 연결해준다.
vector와 forward_list에 sort()를 적용한다고 해보자. sort를 하려면 원소에 접근도 해야하고, 변경도 해야한다. 저 두 container는 내부 원소에 접근하는 방식이 다르므로 서로 다른 sort() 함수를 작성해야 할 것이다.
(vector는 []사용가능하지만, forward_list는 그렇지 않음)
하지만 itertor가 있다면 그럴 필요가 없다. algorithm과 container 사이에서 변환(?) 역할을 해준다. Container와 Algorithm이 약속된 형식의 iterators를 사용한다면 하나의 Algorithm 함수만 있어도 된다.
이게 없다면 처음 설명했던대로 특정 자료구조에서 수행 수 있는 알고리즘마다 알고리즘을 따로 작성해야 할 것이다.
Algorithms은 말 그대로 정렬/탐색 등 알고리즘들이다. 얘는 보통 함수로 구현되는데, 바로 위에서 설명했듯이 인자로 특정 data(pointer 등)을 받는게 아니라 약속된 형태의 Iterator을 받는다.
그리고 그 Iterator가 약속한 연산을 지원한다고 가정하고 해당 알고리즘을 적용한다.
Functors는 함수의 일반화 버전이다. STL에선 이런 Functors를 쉽게 만들 수 있도록 하는 class template과, 원하는 형태의 Functor로 변환할 수 있도록 하는 function adapter을 지원한다.

0개의 댓글