해당 과제를 진행하는데 있어 필요한 사전 지식들을 정리하였습니다.
STL이란 Standard Template Library의 약자로 템플릿을 적용한 라이브러리이다. 임의의 타입에 대해 Container
, Iterator
, Algorithm
을 모두 지원한다.
Container
의 각 요소에 iterator
(반복자)를 통해 접근할 수 있다.Container
내 요소 추가 및 제거를 포함한 다양한 작업을 도와주는 여러 멤버 함수를 포함하고 있다.STL Container
는 크게 세 가지 유형으로 구분된다.vector
, deque
, list
, forward_list
key
와 value
처럼 관련 있는 데이터를 하나의 쌍으로 저장하는 컨테이너set
, multiset
, map
, multimap
Iterator
를 지원하지 않으므로 STL Algorithm
에서는 사용할 수 없음stack
, queue
, priority_queue
STL Container
에 저장된 요소를 반복적으로 순회하여, 각각 요소에 대한 접근을 제공하는 객체이다.sort
, swap
, find
여기서 구현해야하는 easyfind
라고 하는 함수는 Container
에서 특정 값을 찾는 함수이다. easyfind(container T, int N)
형식이며, 두번 째 N
이 T
에서 처음으로 등장하는 지점을 찾 특정 값을 찾지 못하면 std::exception
을 던지거나 에러를 출력한다. Associative Container
에 대해서는 다루지 않아도 된다.
std::find
함수를 이용하여 Container
의 멤버 함수 begin()
과 end()
로 범위를 설정해주고 찾아야하는 값을 인자로 넘겨주면 된다. 반환되는 값을 typename T::iterator iter
에 넣어주고 만약 iter
가 end()
값을 가르키고 있다면 범위 내에 찾는 값이 없다는 뜻이므로 예외를 던진다. Container
의 end()
는 요소의 마지막 값 다음을 가르킨다.
T::iterator
앞에 typename
이 존재하는 이유는 템플릿 매개변수는 타입 또는 값을 받도록 정의할 수 있고, T
가 값이든 타입이든 ::
연산자를 통해 내부 요소에 접근하게 되면 내부 요소가 타입인지 값인지 판별하지 못하기 때문에 타입인 경우에는 typename
을 명시적으로 기재해야 한다.
Span
이라는 클래스를 구현해야 하는데 이 클래스는 생성 시 인자로 받은 N
만큼의 int
형 데이터를 저장할 수 있다. addNumber
이라는 멤버 함수를 통해 요소를 추가하는데 이미 요소가 N
개만큼 다 찼다면 예외를 발생시킨다.
shortestSpan
과 longestSpan
이라는 멤버 함수도 구현해야하는데 shortestSpan
은 내부 요소의 최소 값과 그 다음 최소 값과의 차이를 의미하고, longestSpan
은 내부 요소의 최소 값과 최대 값의 차이를 의미한다. 이를 찾아내기 위해선 <algorithm>
의 함수(min_element
, max_element
, sort
등)를 이용해야 한다. 요소가 하나도 없거나 하나만 있으면 비교할 수 있는 범위가 없으므로 예외를 발생시킨다.
각각의 요소는 std::vector<int>
를 이용해 저장하면 된다. 생성 시 크기를 정해야할 때는 reserve
함수의 인자에 크기 N
을 전달하면 된다. addNumber
함수는 int
값 하나만 인자로 받아 요소를 추가할 수도 있지만 iterator
의 범위를 인자로 받아 한번에 요소를 추가할 수도 있다. 가능케하기 위해선 addNumber
함수를 오버로딩 해야한다.
Adapter Container인 std::stack
은 아쉽지만 iterator
를 제공하지 않는다. ex02
의 목표는 MutuantStack
클래스 작성을 통해 std::stack
에 iterator
를 구현하는 것이다.
Container
에 정의된 iterator
의 종류에는 iterator
, const_iterator
, reverse_iterator
, const_reverse_iterator
가 있다.
iterator
를 이용하는 함수가 begin
과 end
, const_iterator
를 이용하는 함수가 cbegin
과 cend
, reverse_iterator
를 이용하는 함수가 rbegin
과 rend
, const_reverse_iterator
를 이용하는 함수가 crbegin
, crend
가 된다.
각각 매치되는 함수를 사용해 4가지 iterator
를 구현해주면 된다. 다만 단순히 iterator
, const_iterator
, reverse_iterator
, const_reverse_iterator
를 이용하려고 하면, MutantStack<T>
에서는 해당 타입들이 무엇인지 모르기 때문에 typedef typename std::stack<T>::container_type::iterator iterator;
과 같이 typedef
을 통해 별도의 별칭을 정의하여 사용한다.
참고
https://bigpel66.oopy.io/library/42/inner-circle/19
https://velog.io/@hey-chocopie/C-Module-08
https://velog.io/@chaewonkang/CPP-Module-08