본문 바로가기
42Seoul/5circle

[ft_containers] subject 해석

by venniek 2022. 4. 11.

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 클래스를 기본 기저 컨테이너로 사용할 것입니다. 그러나 STLstack이 포함하는 다른 컨테이너들과도 호환되어야 합니다.

% 안내

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 요구사항

  • namespaceft 여야 합니다.
  • 당신의 컨테이너에서 쓰인 내부 자료 구조는 논리적이고 정당해야 합니다(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 저장소에 과제를 제출하세요. 디펜스동안 저장소에 들어있는 작업물만 평가될 것입니다. 파일들의 이름이 맞는지 두 번 체크하세요.

댓글