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
반응형
'대외활동 > 42서울' 카테고리의 다른 글
[42서울] cpp07 구현 (0) | 2024.11.26 |
---|---|
[42서울] Netpractice LEVEL 8 문제 풀이 (1) | 2024.11.11 |
[42서울] minitalk 구현(Makefile 포함) (0) | 2024.08.22 |
[42서울] minishell 테스트 케이스 (0) | 2024.08.11 |
[42서울] so_long 그래픽, mlx 라이브러리 (0) | 2024.08.11 |