copy 함수 바르게 사용하기

STL 컨테이너는 제너릭 알고리즘으로에서는 merge 함수를 사용할 때 주의할 점에 대해서 봤습니다. 이번에는 copy 함수에 대해서 알아보겠습니다.

copy 함수의 리턴 값은 대상 컨테이너의 copy 이후의 마지막 iterator 입니다. 그런데 copy 함수도 merge 함수처럼 대상 컨테이너에 이미 객체를 복사하기 위한 충분한 공간이 확보되어 있다고 가정하고 있습니다.
그러므로 빈 컨테이너에 copy 함수를 실행하여 객체를 추가할 때는 다음과 같이 해야 합니다.


copy(container1.begin(),
     container1.end(),
     back_inserter(container2)) ;
 

함수를 사용하고 나서는 그 결과에 대해서 항상 주의 깊에 봐야 하므로 copy 함수의 결과를 재사용하기 위해 다음과 같이 반환 값을 받아보겠습니다.


container::iterator last =
    copy(container1.begin(),
         container1.end(),
         back_inserter(container2)) ;


그러나, 이 코드는 컴파일되지 않습니다. 컴파일 오류의 원인이 back_inserter(container2)에 있나 싶어서 iterator 어댑터를 사용하지 않으니 컴파일은 되지만 역시나 객체를 추가하기 위한 공간이 충분하지 않아 런타임에 오류가 발생합니다.

사실 컴파일 에러의 원인은 리턴 값의 타입인 반환 값의 타입으로 지정한container::iterator에 있습니다. 우리는 copy 함수의 마지막 인자로 container2를 던져주었다고 생각했지만 실제 인자로 전달된 것은 back_inserter의 타입인 inserter_iterator입니다. 그리고 이 타입은 container의 iterator와 호환되지 않습니다.
iterator 어댑터를 사용해 copy 함수를 사용하는 경우는 리턴 값은 버리세요. 아니면 iterator 어댑터를 반환하면 됩니다.

Comments are closed.

Website Built by WordPress.com.

Up ↑