본문 바로가기

책 정리/More Exceptional C++

(41)
More Exceptional C++ 목차 및 링크 1장 일반화 프로그래밍과 C++ 표준 라이브러리 Item 1: 스트림 전환(Switching Streams) Item 2: 판단자(predicate) Part 1: remove()가 삭제하는 것은? Item 3: 판단자(predicate) Part 2: 상태와 판단자 Item 4: 확장 가능한 템플릿: 상속을 통해서 아니면 특성(traits) 클래스를 통해서? Item 5: Typename Item 6: 컨테이너, 포인터 그리고 컨테이너가 아닌 컨테이너 Item 7: vector와 deque 사용하기 Item 8: set과 map 사용하기 Item 9: 똑같은 코드? Item 10: 템플릿 특화(specialization)와 오버로딩(overloading) Item 11: Mastermind 2장 최적화..
항목 11 : Mastermind (난이도 : 8 ) Mastermind 만들면서 어느정도는 봐줄터이니, 한번 만들어 보도록 하자고 한다. .. 게임 규칙은 http://114pda.com/ppc/game/puzzle/mastermind.htm 에서 확인 할 수 있을 것이다. 이번 화는 답이 없음 루아로만 짜본 Mastermind 총평 .. 언제 한번 만들어 봐야지..
항목 10 : 템플릿 특화(specialization)과 오버로딩(overloading) ( 난이도 : 6 ) .. 음 얼마전 이 부분에 대해서 정리했던게 새록 새록 기억이 새어 나온다. 빠르게 질문해보자. 1. 템플릿 특화는 무엇인가? 예를 들어라. .. 특수화된 템플릿이다. 참조 : http://www.ikpil.com/767 2. 부분 특화는 무엇인가? 예를 들어라. .. 특수화를 부분적으로 한게 부분 특화 이다. 3. 다음 선언을 살펴보자. #include template void g( T1, T2 );// 1 template void g( T ); // 2 template void g( T, T ); // 3 template void g( T* ); // 4 template void g( T*, T );// 5 template void g( T, T* );// 6 template void g( int, ..
항목 9 : 똑같은 코드? ( 난이도 : 5 ) 함수 매개변수를 후위증가 시키는것과 같은 간단한 코드 차이도 결과에 큰 영향을 미칠수 있다는 것을 보여 주는 항목이다. ... 바로 질문 넘어가자. 1. 다음 코드가 하는 일을 설명하라. f( a++ ); f의 경우 1. f가 함수 일 경우, 내부적으로 a의 타입에 맞는 복사 생성자가 호출되어, a와 똑같은 임시객체가 생성되고, 자신을 증가시킨 후, 임시객체를 a++ 자리에 올려 두고 f()에 전달한다. 또한 표준에 의하여, 임시객체를 non-const 로 받을수 없기 때문에 f는 const reference나 복사 생성자를 이용하여 전달해야만 할 것이다. 2. f가 매크로 함수(#define 함수)라면, 경우에 따라서 a가 여러번 호출 될 수 있다는 점이다. 3. f가 객체라면, 1번과 마찬가지 4. ..
항목 8 : set과 map 사용하기 ( 난이도 : 5 ) 바로 질문 들어간다. 1. a) 다음 코드의 문제점은 무엇이고, 어떻게 수정할 수 있을까? #include #include int main( void ) { std::map m; std::map::iterator i = m.find( 13 ); if( i != m.end() ) { const_cast( i->first ) = 99999; } return 0; } 딱 봐도 문제인것은 키 값을 강제로 변경 시키고 있다. map은 자동 정렬 되기 때문에, 이렇게 key 를 바꾸게 되면, 큰 문제가 생기게 되므로 절대 해야 하지 말아야 한다. 만약 키를 바꾸고 싶다면, 다음 코드처럼 해야 한다. b) 다음의 코드를 쓰면 어느 정도까지 문제가 해결 될까? #include #include int main( void..
항목 7 : vector와 deque 사용하기 ( 난이도 : 3 ) 바로 질문 들어가자. 1. 표준 라이브러리에서 vector와 deque는 유사한 기능을 한다. 그렇다면 둘 중 어떤 컨테이너를 써야 할까? 이유는? 둘 중 하나를 골라서 써야 하는 상황은? 음.. 그림으로 표시 바로.. 출처는 http://www.cplusplus.com/reference/stl/ 이다 2. 다음 코드는 어떤 결과를 보여 주나? #include std::vector c ( 10000 ); c.erase( c.begin() + 10, c.end() ); c.reserve( 10 ); 풀이를 하자면 C를 초기에 10000까지 늘리고, 10개 후부터 끝까지 지운 후에 공간을 10으로 만든다. 하지만.. 실제 공간이 10으로 줄여주는것이 아니므로, 줄여주기 위한 목적이라면 resize( 10 )..
항목 6 : 컨테이너, 포인터 그리고 컨테이너가 아닌 컨테이너 바로 질문으로 시작하자. 1. 다음 코드가 정상적으로 작동 하는가? 그렇다면, 어떻게 개선 할 수 있는가? char *p = &v[ 0 ]; 정상적으로 작동한다. 약간 위험해 보이는 코드이기 때문에, iterator를 이용해서 사용 하는 편이 더 안전하다고 생각 될 수 있다. 하지만 .. iterator 쓰기가 부담스러울 때가 있는데, 그때 포인터를 사용 할 수 있겠다. 여기서 왜 iterator가 더 안전하냐하면, 확인과정을 거치면서 이동할 수 있기 때문이다. 그리고 뭐가 더 좋고 뭐가 더 좋다는 말은 못하겠다. 때에 따라서 좋은게 좋은거로 되기 때문이다. 2. 다음 코드는 유효한가? 설명하라. template void f( T& t ) { typename T::value_type *p1 = &t[0]..
항목 5 : typename ( 난이도 : 7 ) 이번 항목은 typename 에 대해서다, 그냥 알고만 있어도 바로 써먹을 수 있으니, 빠르게 정리하고 넘어가도록 한다. 1. typename의 역활은 무엇인가? ① typename은 템플릿 매개변수의 이름을 정할 때, 사용 된다. ② typename은 템플릿 매개변수로 인한 의존적인 타입을 타입으로 사용할 때, 사용 된다. ① 은 쉽게 이해 하겠지만, ②은 가물 가물 할것이다. 질문 2에서 예제와 함게 설명 한다. 2. 아래 코드의 문제점은 무엇인가? template class X_base { public: typedef T instantaited_type; }; template class X : public X_base { public: bool operator() ( const instantaite..