: STL(C++ Standard Template Library)에 대해 공부하는 과제이다. 여기에는 Vector / List / Map 등이 있다. 어디서 많이 들어본 자료형이지 아니한가? 프로그램을 좀 더 쉽고 효율적으로 만들 수 있는 자료형과 알고리즘을 배울 수 있다.
: iterator가 적용되어 있는 vector, list의 iterator의 차이점에 대해서 나와있다.
링크 : https://spenshi.tistory.com/entry/C-%EB%B0%98%EB%B3%B5%EC%9E%90iterator
: STL에 대해서 익숙해지는 시간을 갖는다. 물론 이 프로그램은 STL을 쓰지 않아도 된다. 하지만 연습하는 단계 이므로 꼭 쓰도록 한다. 특정 형태의 Type을 받은 뒤에 그 iterator를 반복하는 함수의 형태는 아래와 같다. ex00에 나오는 easyfind 함수를 기준으로 나타내 보았다.
template <typename T>
typename T::iterator easyfind(T& cont, int data)
{
typename T::iterator ret = std::find(cont.begin(), cont.end(), data);
return ret;
};
: Span이라는 자료형을 만든다. 선언을 할때 N개의 int형 변수를 담을 수 있는 자료형을 만들고, 해당 범위를 벗어나면 예외를 발생시킨다. 정작 중요한 것은 이 자료형에 담긴 대상들의 최단 스팬과 최장 스팬을 구하라는 것이다. 가장 짧은 길이, 가장 긴 길이를 구하면 된다.
여기서 잘 보아야 하는 것은 10,000개의 숫자를 한꺼번에 넣어야 한 다는 것이다. 하나씩 넣는게 아니라 이를 위한 함수를 만들어 놓아야 한다.
아래에 add Number의 예시가 두개가 있다.
void Span::addNumber(int data)
{
if (_stored.size() >= _size)
throw Span::RangeOverException();
_stored.push_back(data);
}
void Span::addNumber(std::vector<int>::iterator const &begin, std::vector<int>::iterator const &end)
{
int distance = std::distance(begin, end) + _stored.size();
if (distance > static_cast<int>(_size))
throw Span::RangeOverException();
_stored.insert(_stored.end(), begin, end);
}
첫번째는 일반적으로 Span에 숫자하나를 추가하는 방식이다.
두번째는 vector의 iterator를 이용해서 한꺼번에 넣는 방식을 나타냈다. 처음과 끝 부분에 대한 iterator 를 가져왔고, 이를 통해 insert를 한꺼번에 하는 방식이다.
: STL중에는 iterator가 없는 대상들도 있다. stack이 바로 그 대상이다. 여기에서는 iterator가 없는 대상에 iterator를 추가하라고 하는 문제이다. 마지막 문제라 그런지 생각보다 쉽지는 않았다.
stack에는 iterator가 없지만, stack에 들어가는 deque에는 iterator가 있다. 다음 링크에서 확인할 수 있다.
링크 : https://en.cppreference.com/w/cpp/container/stack
template<
class T,
class Container = std::deque<T>
> class stack;
stack 헤더를 들어가면 위의 그림과 같이 protected에 container_type 을 가져가게 되고, 이는 보통 deque에서 가져오는 container형태를 가져가게 된다.
: 전에는 자료형만 알고 있었던 것 같은데, iterator가 생각보다 중요하다는 것을 알게 된 과제였다. 프로그램을 좀 더 효율적으로 사용하기 위해서는 STL을 잘 활용해야겠다는 생각을 하게 되었다.
: 어느덧 CPP08 과제가 되었다. 한달동안 쉬지 않고 달려왔었다. 과제 후 평가, 다시 공부하고 평가를 반복하였더니 힘들게 CPP08을 마무리 할 수 있었다. 과제를 마무리하고 정리하는 지금 이 순간까지도 생각해보니 CPP는 이제 시작이라는 생각이 많이 들었다. 그리고 알게 된 것들을 잊지 않기 위해서 노력을 해야겠다는 생각도 많이 들었다. CPP00~08까지 정리를 하였지만 향후에도 필요하다면 중간중간에 다시 정리하고 수정하고를 반복하려고 한다. 향후의 CPP과제에서도 도움이 많이 되었으면 한다.