수업기록 #STL STL (Standard Template Library) Generic Programming 의 대표 문법.

STL의 구성 요소로 표현되어지는 4가지 용어

1. 컨테이너 : 데이터를 저장하는 객체, 즉 자료 구조를 구현한 객체 (클래스 템플릿 집단)

  • [*] 컨테이너의 분류 기준

  • [>] 원소 배치 방식에 따른 분류법 시퀀스컨테이너 연관컨테이너

  • 표준 시퀀스 컨테이너 : vector, deque1, list, array, forward_list2,
    연달아 정렬한 형태로 정리한 컨테이너

  • 표준 연관 컨테이너(정렬) : set, multi-set, map, multi-map 비선형적 구조의 특징을 가진 컨테이너

  • 표준 연관 컨테이너(비정렬) : unordered_set, unordered_map

  • [>] 메모리 저장 방식에 따른 분류법

    • 배열 기반 컨테이너 : vector, deque
    • 노드 기반 컨테이너 : set, multi-set, map, multi-map, list
  • [>] 컨테이너 어댑터(연결 장치)

    • Stack , queue, priority_queue
    • 컨테이너의 기능 중 일부의 기능만 사용 가능, 기능 제한이나 변형되어 있는 형태로 사용함.
    • 컨테이너의 기능을 보완하거나, 추가적인 사용성을 지원하는 용도로 사용함
  • [>] 근사 컨테이너(almost)

    • 템플릿으로서의 속성을 모두 갖추지 못한 상황의 컨테이너
    • string / wstring

2. 알고리즘 (STL 알고리즘) #include <algorithm> 파일을 포함해야 제공하는 STL 함수들을 사용할 수 있음

  • [*] 대량의 데이터를 관리할 떄 무엇이 더 효울적인지에 대한 것을 다루는 학문
  • [?] 알고리즘의 사용처 탐색 / 정렬 / 삭제와 같은 방법 일반화된 방법으로 제공, 함수 템플릿 집단 특정 컨테이너 멤버가 아닌 전역 함수의 형태로 제공 다수 컨테이너에 대해 동일하게 적용 가능하도록 캡슐화를 진행하지 않음.

보통 알고리즘을 사용하는 형태 = 알고리즘 (begin, end, 조건자) 범위를 지정해주어, 순회를 하며 조건에 맞는 것을 찾아주는 형태

3. 함수 객체

  • [*] 객체를 함수처럼 사용하는 문법. 함수 포인터보다는 함수 객체를 이용해서 만드는 것이 권장됨. 보편적으로는 bool 타입을 반환하는 형태로 제작하며, STL 알고리즘 동작의 조건을 제공하기 위해 제작됨.
  • [!] 그러나 람다식의 등장으로 사용 입지가 줄어들게 되었음.

4. 반복자 ⭐⭐⭐

  • [*] 컨테이너 안의 원소를 접근하기 위한 용도의 객체(절대 포인터 아님3) 컨테이너 마다 개별적인 반복자를 소유하고 있으나, 멤버 변수or 함수는 아님4
  • 관리하는 방식이 컨테이너 마다 다르기 때문에 컨테이너를 순회하는 방법과 원소를 참조하는 방법을 획일화하여 사용할 수 있도록 제공

STL 컨테이너의 특성

  • [I] 벡터의 특성 vector

    1. 반개 구간 (반만 열렸다) [ begin, end ) - 시작은 언제나 같지만, 끝은 정해지지 않았다.
    2. 동적 배열을 기반으로 하는 컨테이너.
    3. 인덱스 접근이 가능하다 = 탐색이 빠르다.⭐
    4. 삽입 시에 앞에서부터 삽입할 수 없다. (맨 끝부터 추가)
    5. 중간 삽입 및 삭제 시, 원소 개수 만큼의 선형적 시간 복잡도가 발생함.(꺼내서 지우고 다른 곳에 재할당)❗
    6. 벡터의 원소를 삭제해도 존재했던 공간(메모리)은 남아있다.
    7. 맨 끝에 삽입 삭제 시에는 상수 시간 복잡도가 발생한다. (빠르다)
    8. 배열의 크기를 넘어갓을 때, 동적 배열의 재할당과 원소 복사가 있기에 느리다.
  • [I] 리스트의 특성 List

    1. 노드를 기반으로 하는 컨테이너
    2. 앞/뒤 노드의 삽입 삭제가 가능하다.(상수 시간 복잡도)⭐
    3. 비연속적인 공간에 나열된 노드들을 연속된 것처럼 나열. 그래서 인덱스 접근이 불가함. ❗
    4. 탐색과 순회가 반드시 순서대로 진행되기 때문에 선형 시간 복잡도가 걸린다.
    5. ++/-- 연산자만 오버로딩 되어 있음.
    6. 한정된 메모리 공간을 사용하는 것이 아니기 때문에 데이터 저장이 유연하다.⭐
  • [I] 덱(deque)의 특성 deque

    1. vector의 한 종류의 컨테이너이며 동적 배열 기반이다.
    2. 인덱스 접근이 가능하다.
    3. chunck5 형태의 데이터 저장이 진행됨.
    4. 벡터와 리스트가 혼합된 형태.
    5. 벡터랑 비교했을 때 8배 가까이 되는 메모리 용량을 요구함.
  • [I] 표준 연관 컨테이너의 특성(정렬)

    1. 기본적으로 트리 기반으로 구성된 컨테이너.

[#추천도서] 제프리 리처의 WINDOWS VIA C/C++(복간판) - 국내도서 (준형이형 추천)

Footnotes

  1. 메모리에 일정한 크기를 지닌 블록 형태로 흩어져서 저장되는 자료구조

  2. 양방향 이동이 불가하고, 단방향 이동만 가능한 리스트

  3. 포인터의 연산자를 오버로딩하여 포인터처럼 사용할 뿐, 포인터로 착각하면 안됨.

  4. 컨테이너 마다 이터레이터라는 객체를 이너 클래스로 지니고 있는 형태

  5. 메모리 구성 단위, 즉 데이터 블럭이라고 보는 것이 맞음