이 문제에 대해서, 많은 책들이 지적하고 있다. 가장 효과적인 해결책을 이 책에서도 설명하고 있는데, 우선 보도록 하자.

1 ) 다음 코드는 무엇인가?

이 코드는 coll1 컨테이너하나를 생성하고, 그곳에 문자열을 넣는 소스이다. 뭐 더 설명할 것이 없다. back_inserter 를 사용했고, copy 를 사용했다.

istream_iterator 는 "입력 스트림 이터레이터" 라고 하는데, 입력 스트림을 읽어 첫번째 템플릿 매개변수 형식에 맞추어 값을 저장하는데, 위의 코드에선 string에 대입(임시객체라 봐도 될 듯)시켜 준다. 사실 템플릿 매개변수는 총 4가지 인데, 나머지 3가지는 디폴트가 있기 때문에, 위에 처럼 써도 된다.

입력 스트림 이터레이터의 생성자는 입력 스트림 객체를 인수로 받는데, std::cin 이 그것이다. 입력 스트림 인터레이터는 operator++ 로 다음 입력 스트림을 받을 수 있다. 이 때, 그 전에 받아 두었던 객체가 있다면 날라간다. 위에선 string 이 날라간다.

더 자세한 것은 다른 곳을 찾아 보는게 좋을 듯 하다. (구글링 : istream_iterator)

본론으로 돌아와서, 코드의 문제점을 지적해 본다면(문제점까지는 아니지만), copy 함수에 3개의 매개변수 전부를 그 함수의 실행코드 안에 넣게 되면, 아무래도 가독성이나, 버그(.. 이것 역시 찾아보면 많이 나오니 생략)등 예기치 않은 문제가 있을 수 있으니 객체를 copy 함수 위에서 생성하고 쓰는게 좋다.

이 문제점은 다은 링크와 같은 취지에 있다. : http://ikpil.com/720


2 ) 다음 코드는 무엇인가?

15 라인, deque의 생성자를 호출하여 생성하는데, 두개의 이터레이터를 받아서 생성하는 것이다. 이 두개의 이터레이터는 범위를 나타내는 것이기 때문에, 그 범위 안에 있는 모든 원소들을 복사한 deque가 만들어 진다.

17 라인, 이번 항목에서 제일 중요하게 생각하는 부분이다. 15라인 처럼, 두개의 입력스트림 이터레이터를 받아 들이어, 그 범위 안에 있는 모든 원소들을 복사하여, 생성자를 호출 한다.

.. 로 정리하면 당신은 함정에 빠진 것이다. 왜냐하면 저 위의 정의는 함수 선언이기 때문이다.

여담

웃기게도 Dev C++ 컴파일러에서는 .. 잘 컴파일 된다. 저게 어떻게 되는지 도통 모르겠다.(아시는 분은 좀 알려 주세요...)

저 위의 코드만 보면, 많이 헷갈리니, 좀 간략한 코드를 보자.

자, f는 int 형을 반환하고 void 형을 매개변수를 받는 함수를 매개변수로 하는 함수이다. 말로 표현하니 참 힘들다. f를 다음과 같이 쓸수 있는데, 한번 보자.

.. f는 무엇일까?

함수의 정의 표현식은 매개변수의 이름을 생략 할 수 있다. 그러므로 엄연히 f는 함수다. .. 그것도 위와 동일한 함수이다.

본론으로 돌아와서 이건 뭘까?

.. 함수다. 그것도 매우 보기 힘든 함수...

3 ) 코드가 프로그래머의 원래 의도대로 작동하게 하려면 어떻게 고쳐야 하는가?

.. 이렇게 고치면 된다.


총평

이런 부분은 조심해야 된다.


posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요