C++ STL 중 몇 가지 컨테이너를 구현해 보기 각 표준 컨테이너의 구조를 참고하기. 만약 해당 표준 컨테이너에 Orthodox Canonical form이 없으면, 구현하지 말기 C++98 표준을 따라야 하며, 따라서 해당 컨테이너의 98 이후 버전에 생긴 특성은 절대로 구현하면 안 됨. 하지만 98 버전의 모든 특성은 반드시 구현되어야 함(만약 현재는 사라진 특성이 98에 있다면, 그것도 구현해야 함)
- 컴파일
- c++로 컴파일 하며, -Wall -Wextra -Werror 플래그를 포함함
- -std=c++98 플래그가 들어가더라도 코드가 동작해야 함
- 형식 및 이름 컨벤션
- 각 컨테이너 마다 클래스 이름을 적절하게 명명해야 함
- 노미넷 없음! 원하는 코딩 스타일에 따르기. 단, 평가자가 이해할 수 없는 코드는 채점되지 않음. 깨끗하고 가독성 높은 코드를 짜기 위해 최선을 다해야 함
- 허용 및 금지
이제 C가 아닌 C++로 코딩하기 때문에,
- 표준 라이브러리의 모든 것을 사용할 수 있음. 따라서, 이미 알고 있던 방식과 C 스타일의 함수 사용을 벗어나 C++스러운 버전을 사용하는 것이 좋음
- 하지만, 다른 외부 라이브러리의 사용은 금지됨. C++11 및 파생 버전, 그리고 Boost 라이브러리를 사용할 수 없음. printf(), alloc(), free() 함수는 금지되며, 사용한 경우 0점으로 처리됨
- 몇 가지 디자인적 요구사항
- C++에서도 메모리 누수는 여전히 발생함. 메모리를 할당한 경우, 반드시 메모리 누수를 방지해야 함
- 헤더 파일에 함수를 구현한 경우 0점으로 처리됨 (함수 템플릿은 제외)
- 헤더는 서로 독립되게 사용되어야 함. 따라서 각각의 헤더에 필요한 것을 모두 include 해야 함. 그러나 인클루드 가드를 통해 더블 인클루드를 막을 수 있을 것임. 이 항목이 만족되지 않은 경우, 0점으로 처리됨
- 추가 정보
- 필요한 경우, 코드를 나누거나 작업물을 정돈하기 위해 파일을 추가로 만들어도 됨. 그 대신 mandatory 파일은 반드시 있어야 함. 추가만 가능
다음의 컨테이너를 구현하고, .hpp 파일을 제출하시오
- vector vector 은 구현할 필요 없음
- map
- stack 디폴트 기저 컨테이너로 vector 클래스를 사용함. 단, STL 컨테이너가 포함된 다른 컨테이너들과도 여전히 호환 가능해야 함 stack을 구현하지 않아도 과제 통과 가능함(80점). 그러나 만약 보너스까지 완성하고 싶다면, 반드시 위 3가지 컨테이너를 구현해야 함
다음의 것들도 구현해야 함
- iterators_traits
- reverse_iterator
- enable_if 이것은 C++11 특성이긴 하지만 C++98 방식으로 구현할 수 있음. 이 특성의 구현은 당신이 SFINAE를 발견?할 수 있도록 하기 위해 요구된 것임
- is_integral
- equal 또는 lexicographical_compare (둘 다 구현해도 되고, 둘 중 하나만 구현해도 됨)
- std::pair
- std::make_pair
요구사항
- namespace는 ft여야 함
- 각각의 컨테이너에 사용되는 내부 자료구조는 논리적이고 정당해야 함 (예를 들면 map에 단순한 array를 사용하면 안 된다는 뜻)
- 표준 컨테이너에서 제공하는 것보다 더 많은 public 함수를 구현하면 안 됨. 추가로 구현한 것은 반드시 private나 public이어야 함. 각각의 public 함수와 public 변수는 정당해야 함
- 표준 컨테이너의 모든 멤버 함수, 비멤버 함수 및 오버로드를 구현해야 함
- 기존의 명명을 그대로 따라야 함. 디테일에 주의할 것
- 만약 해당 컨테이너에 iterator 체계가 있으면 구현해야 함
- 반드시 std::allocator를 사용해야 함
- 비멤버 오버로드의 경우, friend 키워드의 사용을 허용함. friend는 정당한 경우에 사용되어야 하며, 평가 중 확인될 것임
- 물론 map::value_compare를 구현할 때 friend 키워드를 사용할 수 있음
참고 https://www.cplusplus.com/ https://cppreference.com/
구현 테스트
- 디펜스를 위해 적어도 main.cpp를 제출해야 함. 서브젝트와 함께 제공되는 main.cpp 파일보다 더 많은 테스트 코드를 작성할 것
- 같은 테스트를 두 바이너리에 적용해 동작 비교하기: 하나는 우리가 구현한 컨테이너, 다른 하나는 STL 컨테이너
- 출력, 성능 및 타이밍 비교하기 - 우리가 구현한 컨테이너는 최대 20배 정도까지 느릴 수 있음
- 구현한 컨테이너를 ft::로 테스트 하기
평소처럼 Git repo에 과제 제출 repo 안에 있는 작업물만 평가될 것임 파일 이름이 정확한 지 꼭 두 번 체크하기 표준 컨테이너의 명명법을 따랐는지 꼭 한 번 더 체크하기