Home CPP Module 08 : STL
Post
Cancel

CPP Module 08 : STL

주제

  • STL (Standard Template Library)
    • 컨테이너(containers)
    • 반복자(iterators)
    • 알고리즘(algorithms)

Ex00

주요 개념

컨테이너

  • 시퀀스 컨테이너
    • vector
    • deque
    • list
    • forward_list

STL 알고리즘

  • 주요 함수
    • min_element
    • max_element
    • find
    • sort
    • remove
    • lambda

과제 내용

  • T는 int형 데이터를 담는 컨테이너
    • 첫번째 인자(컨테이너)에서 두번째 인자(int형 정수)가 처음 나오는 위치를 찾기.
  • 반복자를 통해 요소에 접근

구현 사항

  • const형의 컨테이너를 다루기 위해서는 const_iterator가 필요함

Q&A

  • vector
    • push_back() vs insert()
      • 공통점
        • 새로운 요소를 추가한다.
        • 현재의 iterator가 무효화 될 가능성이 있다.
          • 벡터의 크기가 resize된 경우에만 해당.
      • 차이점
        • push_back : 벡터의 끝에 새 요소를 추가. insert보다 빠르다.
        • insert : 특정한 위치에 새 요소를 추가

Ex01

주요 개념

vector

  • 특징
    • 메모리에 연속적으로 배치되어 있다.
    • 선언하게 되면 크기가 0인 벡터가 생성된다.
  • 멤버 함수
    • reserve(n)
      • n개의 요소를 저장할 공간을 미리 할당한다.
    • resize
    • front, back
    • insert

iterator

  • 컨테이너의 핵심 구성요소로, 컨테이너의 요소들을 이동하며 접근하여 수정하는데 사용된다.
  • begin(), end()
    • 맨 앞 요소의 주소, 맨 뒤 요소의 다음 주소
  • max_element(), min_element()
  • find()

과제 요구사항

  • span : 차이가 최대, 최소일 때를 구하기

구현사항

  • longestSpan
    • max_element - min_element
  • shortestSpan
    • sort
    • new_vector의 처음부터 반복문을 돌며 인접한 요소들간의 차이를 비교
      • 기존값(max - min)보다 작다면 : span에 저장
      • 0이라면 : 0 반환

Ex02

주요 개념

컨테이너 어댑터

  • stack
  • queue
  • priority_queue

스택

  • std:stack 클래스는 기반에 있는 컨테이너를 사용. 주로 deque로 되어있다.
  • 어댑터 컨테이너
    • 다른 클래스를 가져와 다른 인터페이스로 사용되도록 하는 것
      • 스택의 경우, deque 또는 vector를 가져와서 스택처럼 사용되게(stack-like interface) 해준다.

iterator의 종류

  • 순방향
    • iterator
      • 요소에 접근하여 수정하는데 사용된다.
    • const_iterator
      • 요소에 접근만 가능하다.
      • 요소를 수정하는 것은 불가능하다.
  • 역방향
    • reverse_iterator
      • 요소를 거꾸로 순회하기 위해 사용된다.
    • const_reverse_iterator
      • 요소에 접근만 가능하다.

과제 구현

  • main
    • list
      • 마지막 요소를 가르키는 방법
        • vector와 다르게 iter - 1과 같은 조건문은 안된다.
          • vector에는 - 연산자가 정의되어 있지만 list에는 안되어있기 때문이다.
        • if (itr != std::prev(itr_end)) 와 같이 사용할 수 있다.
  • iterator
    • deque의 iterator를 사용한다.
    • this→c.begin()
      • c : 컨테이너를 의미
      • begin() : deque의 멤버 함수
      • this를 사용해서 접근해야 하는 이유?
        • 클래스를 상속받을 때, 변수명이 겹치면 파생클래스의 변수가 숨겨진다.
        • 따라서 this를 명시적으로 사용해서 파생클래스인 stack의 c를 사용하는 것

Q&A

  • stack을 상속받은 MutantStack은 deque의 iterator 기능을 사용할 수 있지만 stack에서는 사용할 수 없는 이유?
    • stack처럼 동작(LIFO)하도록 다른 방식으로의 요소 접근은 막아놓았기 때문이다.

Ref.

This post is licensed under CC BY 4.0 by the author.

CPP Module 07 : 템플릿

Inception ① 배경 지식 : Docker