[42서울] cpp08 구현

2024. 11. 27. 01:12·대외활동/42서울
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서울] inception 구현과 설명 (도커 이미지 설계하기)  (0) 2025.02.13
[42서울] inception 도커의 개념 (가상환경, 볼륨, 동작 원리)  (1) 2025.02.09
[42서울] cpp07 구현  (0) 2024.11.26
[42서울] Netpractice LEVEL 8 문제 풀이  (1) 2024.11.11
[42서울] minitalk 구현(Makefile 포함)  (0) 2024.08.22
'대외활동/42서울' 카테고리의 다른 글
  • [42서울] inception 구현과 설명 (도커 이미지 설계하기)
  • [42서울] inception 도커의 개념 (가상환경, 볼륨, 동작 원리)
  • [42서울] cpp07 구현
  • [42서울] Netpractice LEVEL 8 문제 풀이
dev_ares
dev_ares
대학에서 컴퓨터공학을 전공하고 있는 학생입니다.
    반응형
    250x250
  • dev_ares
    노트
    dev_ares
  • 전체
    오늘
    어제
    • 분류 전체보기 (188)
      • IT 트랜드 (2)
      • 백엔드 (18)
        • Java + Spring (8)
        • Kotlin + Spring (5)
        • 백엔드 (5)
      • 프론트엔드 (1)
        • React (1)
      • 대외활동 (17)
        • 42서울 (17)
      • 백준 (6)
        • Java (2)
        • C++ (3)
      • 전공 (121)
        • 객체지향프로그래밍 (17)
        • 자료구조 (23)
        • 리눅스시스템관리 (16)
        • 컴퓨터구조 (25)
        • 네트워크 (25)
        • 데이터베이스 (15)
        • 기타 전공 (0)
      • 프로그래밍 언어 (18)
        • Java (5)
        • Swift (4)
        • C++ (1)
        • Kotlin (8)
      • 기타 (4)
      • 공군 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    데이터패스
    반복자
    리눅스
    오블완
    컴공 포트폴리오
    코틀린
    상속
    컴퓨터구조
    백준
    메모리 계층 구조
    자바
    42서울
    컴퓨터 구조 및 설계
    사설 문제
    추가 문제
    명령어
    자료구조
    단일 사이클
    C++
    티스토리챌린지
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
dev_ares
[42서울] cpp08 구현
상단으로

티스토리툴바