주제
- 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()
vsinsert()
- 공통점
- 새로운 요소를 추가한다.
- 현재의 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
- 요소에 접근만 가능하다.
- 요소를 수정하는 것은 불가능하다.
- iterator
- 역방향
- reverse_iterator
- 요소를 거꾸로 순회하기 위해 사용된다.
- const_reverse_iterator
- 요소에 접근만 가능하다.
- reverse_iterator
과제 구현
- main
- list
- 마지막 요소를 가르키는 방법
- vector와 다르게 iter - 1과 같은 조건문은 안된다.
- vector에는
-
연산자가 정의되어 있지만 list에는 안되어있기 때문이다.
- vector에는
if (itr != std::prev(itr_end))
와 같이 사용할 수 있다.
- vector와 다르게 iter - 1과 같은 조건문은 안된다.
- 마지막 요소를 가르키는 방법
- list
- iterator
- deque의 iterator를 사용한다.
this→c.begin()
- c : 컨테이너를 의미
- begin() : deque의 멤버 함수
- this를 사용해서 접근해야 하는 이유?
- 클래스를 상속받을 때, 변수명이 겹치면 파생클래스의 변수가 숨겨진다.
- 따라서 this를 명시적으로 사용해서 파생클래스인 stack의 c를 사용하는 것
Q&A
- stack을 상속받은 MutantStack은 deque의 iterator 기능을 사용할 수 있지만 stack에서는 사용할 수 없는 이유?
- stack처럼 동작(LIFO)하도록 다른 방식으로의 요소 접근은 막아놓았기 때문이다.