[42Seoul] - CPP Module08

Joey·2022년 11월 15일
0

42 SEOUL

목록 보기
15/20



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개의 댓글