1.무엇을 하는 과제인가?

: STL(C++ Standard Template Library)에 대해 공부하는 과제이다. 여기에는 Vector / List / Map 등이 있다. 어디서 많이 들어본 자료형이지 아니한가? 프로그램을 좀 더 쉽고 효율적으로 만들 수 있는 자료형과 알고리즘을 배울 수 있다.




2.과제를 하면서 참고 했던 곳들

1)iterator

: iterator가 적용되어 있는 vector, list의 iterator의 차이점에 대해서 나와있다.
링크 : https://spenshi.tistory.com/entry/C-%EB%B0%98%EB%B3%B5%EC%9E%90iterator





3.과제를 하면서 공부했던 것들

1)ex00

: 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;
};


2)ex01

: 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를 한꺼번에 하는 방식이다.



3)ex02

: 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형태를 가져가게 된다.




4.회고

1)STL

: 전에는 자료형만 알고 있었던 것 같은데, iterator가 생각보다 중요하다는 것을 알게 된 과제였다. 프로그램을 좀 더 효율적으로 사용하기 위해서는 STL을 잘 활용해야겠다는 생각을 하게 되었다.

2)CPP 과제 완료

: 어느덧 CPP08 과제가 되었다. 한달동안 쉬지 않고 달려왔었다. 과제 후 평가, 다시 공부하고 평가를 반복하였더니 힘들게 CPP08을 마무리 할 수 있었다. 과제를 마무리하고 정리하는 지금 이 순간까지도 생각해보니 CPP는 이제 시작이라는 생각이 많이 들었다. 그리고 알게 된 것들을 잊지 않기 위해서 노력을 해야겠다는 생각도 많이 들었다. CPP00~08까지 정리를 하였지만 향후에도 필요하다면 중간중간에 다시 정리하고 수정하고를 반복하려고 한다. 향후의 CPP과제에서도 도움이 많이 되었으면 한다.

profile
세상을 이롭게 하는 프로그램 만들기

0개의 댓글

Powered by GraphCDN, the GraphQL CDN