대외활동/42서울

[42서울] cpp08 구현

커피와 개발자 2024. 11. 27. 01:12
728x90
반응형

CPP08 템플릿, STL (Standard Template Library), 그리고 반복자와 같은 C++ 개념을 다루는 과제이다.
 

C++ 반복자(iterator)란?

반복자(iterator)는 C++의 STL(표준 템플릿 라이브러리)에서 컨테이너의 요소를 순회(traverse)하거나 접근(access)하기 위해 사용되는 추상화된 포인터이다.
컨테이너 내부 구현에 독립적이며, 배열이나 연결 리스트 같은 자료구조를 한 가지 방식으로 순회할 수 있게 해준다.
 

반복자의 역할

  • 반복자는 컨테이너의 첫 번째 요소부터 마지막 요소까지 순회하는 데 사용됩니다.
  • STL 알고리즘(std::sort, std::find 등)은 반복자를 통해 컨테이너와 상호작용합니다.
  • 반복자는 컨테이너의 세부 구현을 감춥니다. (추상화)

 

ex00

#ifndef EASYFIND_HPP
# define EASYFIND_HPP

#include <iostream>

template <typename T>
int easyfind(T &t, int n)
{
	if (std::find(t.begin(), t.end(), n) == t.end())
		throw std::exception();
	return *std::find(t.begin(), t.end(), n);
}

#endif //EASYFIND_HPP

 
템플릿은 특정 타입에 제한되지 않는 범용적인 코드를 작성할 수 있게 함
STL의 알고리즘(std::find)을 사용해 컨테이너 안에서 데이터를 검색
 
easyfind 함수는 템플릿을 사용하여 다양한 컨테이너에서 특정 정수를 찾는다. 값이 존재하지 않으면 예외를 던진다.
 

ex01

#ifndef SPAN_HPP
# define SPAN_HPP

#include <vector>


class Span
{
private:
	std::vector<int>	_stack;
	unsigned int		_size;
	unsigned int		_index;

	Span();

public:
	Span(unsigned int n);
	Span(Span const &src);
	~Span();
	Span &operator=(Span const &obj);

	void	addNumber(int n);
	void	addNumber(std::vector<int> v);
	int		shortestSpan();
	int		longestSpan();
};


#endif //SPAN_HPP
void Span::addNumber(int n)
{
	if (_index >= _size)
		throw std::exception();
	_stack.push_back(n);
	_index++;
}

void Span::addNumber(std::vector<int> v)
{
	if (_size < v.size())
		throw std::exception();

	for (size_t i = 0; i < v.size(); ++i) {
		_stack.push_back(v[i]);
		_index++;
	}
}

int Span::shortestSpan()
{
	if (_index < 2)
		throw std::exception();

	int min = INT32_MAX;
	std::sort(_stack.begin(), _stack.end());
	for (unsigned int i = 0; i < _index - 1; i++)
		if (min > _stack[i + 1] - _stack[i])
			min = _stack[i + 1] - _stack[i];
	return min;
}

int Span::longestSpan()
{
	if (_index < 2)
		throw std::exception();
	std::sort(_stack.begin(), _stack.end());
	return _stack[_index - 1] - _stack[0];
}

STL의 알고리즘을 활용한다.

  • addNumber: 정수를 추가하거나 벡터를 추가
  • shortestSpan: 정렬된 상태에서 인접한 두 수의 차이 중 최솟값을 반환
  • longestSpan: 정렬된 상태에서 가장 큰 값과 가장 작은 값의 차이를 반환

 

ex02

#ifndef MUTANTSTACK_HPP
# define MUTANTSTACK_HPP

# include <stack>

template <typename T>
class MutantStack : public std::stack<T>
{
public:
	/* Orthodox Canonical Form */

	typedef typename std::stack<T>::container_type::iterator iterator;

	iterator begin()
	{
		return std::stack<T>::c.begin();
	}

	iterator end()
	{
		return std::stack<T>::c.end();
	}
};

#endif //MUTANTSTACK_HPP

 
STL 컨테이너를 상속받아 커스텀 반복자를 구현
반복자를 통해 컨테이너를 순회하는 방식을 직접 확장
 
begin()과 end() 메서드를 통해 내부 컨테이너(c)의 반복자를 반환
반복자를 사용하여 스택 요소를 순회할 수 있음

728x90
반응형