ft_containers
C++ 컨테이너, 쉬운 버전
요약 : C++
에서 이용할 수 있는 여러 종류의 컨테이너들은 각기 다른 사용법이 있습니다. 이 모든 것들을 직접 한번 재구현해보면서 정말로 이해하고 있는지 확인해봅시다!
Chapter 1
목표
이 프로젝트에서, C++
의 표준 템플릿 라이브러리의 몇 가지 컨테이너 타입을 구현할 것입니다.
각 표준 컨테이너의 구조를 기준으로 삼아야 합니다. 만약 Orthodox Canonical form
의 일부가 누락된 경우, 그것은 구현하지 마세요.
다시 말하는데, C++98
표준을 준수해야 하므로, 그 후에 나온 것들은 구현하면 안 되고, C++98
에 있는 모든 것들(사용되지 않는 것도)은 구현해야 합니다.
Chapter 2
General rules
Compiling 컴파일링
- 코드를
-Wall -Wextra -Werror
플래그를 넣어c++
로 컴파일하세요. -std=c++98
플래그를 넣어도 코드가 잘 컴파일되어야 합니다.
Formatting and naming conventions 형식과 이름짓기 컨벤션
- 각 컨테이너를 적절한 이름으로 된 클래스 파일로 제출하세요.
- 노미넷 안녕! 강제되는 코딩 스타일은 없습니다. 가장 좋아하는 것을 따르세요. 하지만 당신의 동료 평가자가 이해할 수 없는 코드는 점수를 줄 수 없다는 것을 명심하세요. 깔끔하고 쉽게 읽을 수 있는 코드를 작성하도록 노력하세요.
Allowed/Forbidden 허용/비허용
더이상 C
를 하지 않습니다. C++
을 할 시간입니다! 그러므로,
- 여러분은 표준 라이브러리에 있는 모든 것들을 사용할 수 있습니다. 그러므로, 여러분이 알고 있던 것을 고집하기보다는
C
에서 사용하던 함수의C++
버전을 사용하는 것이 현명할 것입니다. - 그러나, 다른 외부 라이브러리는 사용할 수 없습니다.
C++11
(그리고 파생된 형태)과Boost
라이브러리가 금지된다는 것을 의미합니다. 또 다음 함수들도 금지됩니다:*printf()
,*alloc()
,free()
. 만약 이것들을 쓴다면, 0점을 받게 되고 그대로 끝입니다.
A few design requirements 작은 디자인적인 요구들
C++
에서도 메모리 누수는 발생합니다. 메모리를 할당할 때엔, 메모리 누수를 반드시 피해야 합니다.- 함수 템플릿을 제외하고, 헤더 파일에 들어있는 함수 구현은 0점입니다.
- 헤더들 각각을 다른 것들과 독립적으로 사용할 수 있어야 합니다. 그러므로, 그것들은 그들이 필요한 모든 의존성을 포함해야 합니다. 하지만,
include
가드를 더해서double inclusion
문제는 피해야 합니다. 그렇지 않으면, 점수는 0점입니다.
Read me 읽어보세요
- 필수 파일들을 제출하는 한, 필요한 경우(즉, 코드를 나누기 위해) 추가적인 파일을 더할 수 있고 원하는 방식으로 결과물을 구성할 수 있습니다.
- 오딘의 힘으로, 토르의 힘으로! 머리를 쓰세요!!!
% 주의
당신이 해야 할 게 STL
컨테이너를 다시 짜는 것이기 때문에, 당연히 너의 것을 구현하는 데에 그들(STL
)을 사용하면 안 됩니다.
%
Chapter 3
Mandatory part 필수 사항
다음의 컨테이너들을 구현하고 <container>.hpp
파일을 제출하세요.
vector
vector<bool>
은 하지 않아도 됩니다.map
stack
당신이 만든vector
클래스를 기본 기저 컨테이너로 사용할 것입니다. 그러나STL
의stack
이 포함하는 다른 컨테이너들과도 호환되어야 합니다.
% 안내
stack
을 하지 않아도 80/100
점으로 이 과제를 통과할 수 있습니다. 하지만 보너스 파트를 하고 싶다면 세 가지 필수 컨테이너를 구현해야 합니다: vector
, map
, stack
%
또한 이것들도 구현해야 합니다:
iterators_traits
reverse_iterator
enable_if
맞아요, 이건C++11
에 있지만,C++98
에 맞춰 구현할 수 있어요. 이걸 하면SFINAE
를 발견할 수 있어요.is_integral
equal
그리고/또는lexicographical_compare
std::pair
std::make_pair
Requirements 요구사항
namespace
는ft
여야 합니다.- 당신의 컨테이너에서 쓰인 내부 자료 구조는 논리적이고 정당해야 합니다(
map
을 위해 단순 배열을 사용하는 것은 괜찮지 않다는 뜻입니다). - 당신은 표준 컨테이너에서 제공되는 것보다 많은
public
함수를 구현하면 안 됩니다. 다른 모든 것들은private
이나protected
여야 합니다. 각public
함수나 변수는 정당해야 합니다. - 표준 컨테이너의 모든 멤버 함수, 비멤버 함수와 오버로딩을 구현하세요.
- 당신은 원래 이름을 따라야 합니다. 디테일에 주의하세요.
- 컨테이너가
iterator
시스템을 가지고 있다면, 구현해야 합니다. std::allocator
를 사용해야 합니다.- 비멤버 오버로딩에서는,
friend
키워드가 허용됩니다. 각friend
의 사용은 정당해야 하고 평가 중 확인되어야 합니다. - 당연히,
map::value_compare
의 구현에서friend
키워드가 허용됩니다.
% 안내
레퍼런스로 https://www.cpluscplus.com/ 이나 https://cppreference.com/ 을 사용할 수 있습니다.
%
Testing 테스트
- 디펜스를 위해, 적어도
main.cpp
로 테스트를 제공해야 합니다. 예시로 주어진main
보다 더 많은 걸 보여줘야 합니다! - 같은 테스트를 실행하는 두 바이너리를 만들어야 합니다: 당신의 컨테이너만 있는 것,
STL
컨테이너가 있는 것. - 결과와 퍼포먼스/시간을 비교하세요(
20배
까지 느려도 괜찮습니다). ft::container
로 당신의 컨테이너를 테스트하세요.
% 안내
main.cpp
파일은 인트라 프로젝트 페이지에서 다운로드 받을 수 있습니다.
%
Chapter 4
마지막 컨테이너를 구현하면 보너스 점수를 받게 될 것입니다:
set
하지만 이번에는,Red-Black tree
가 필수적입니다.
% 경고
보너스 파트는 필수 파트가 완벽할 때만 평가될 것입니다. 완벽이란, 필수 파트가 통합적으로 수행되고 오작동 없이 작동함을 의미합니다. 만약 필수 요구 사항을 통과하지 못하면, 보너스 파트는 전혀 평가되지 않을 것입니다.
%
Chapter 5
제출과 동료 평가
평소처럼 Git 저장소에 과제를 제출하세요. 디펜스동안 저장소에 들어있는 작업물만 평가될 것입니다. 파일들의 이름이 맞는지 두 번 체크하세요.
댓글