가장 맨 처음 어떤 STL Container에 들어있는 값들을 출력을 하려고 하면 흔히 사용하는 방법이 해당 Container에 속해있는 Iterator로 전진반복을 하면서 출력하는 것입니다. 보통 아래와 같은 코드가 되죠.
그런데 알고보면 이게 오히려 가독성을 떨어트릴 수도 있습니다. 실제로 for 구문에 대하여 모든 것을 인식해야 하고 조건, 증가식등을 알아야 하기 때문이죠. 그에 반해 좋은 방법이 하나 존재합니다. 바로 std::copy 알고리즘을 사용하는 것인데요. 사용법은 바로 아래와 같습니다.
이 것은 std::copy가 begin 에서 부터 end 까지 ( , ] 구간을 std::ostream_iterator 함수 객체에 대하여 = assign 연산을 수행 시켜주는 알고리즘이기 때문에 가능한 것이죠. 물론 함수객체가 아닌 함수 포인터도 가능합니다. 그런데 std::ostream_iterator 가 왜 이렇게 되는지 궁금하지 않나요? iterator 헤더 안에 들어가 검색을 해보니 다음과 같은 소스 부분이 존재하더군요.
바로 선언시 전달 받은 ostream_type을 함수객체의 지역성에 의하여 보관하고 있는 상황에서 해당 객체에 대한 = operator에 의한 Assign 문장이 실행되면 *Myostr 에 << 연산으로 값을 넣게 되는 것입니다. 이 것은 미리 basic_ostream 객체( 예를 들면 cout )에서 미리 정의된 객체에 대하여 << 연산자가 미리 정의 되어있기 때문에 가능한 것이죠. 만약 미리 정의 되지 않았다면 << 연산에 대하여 컴파일 에러가 발생합니다. 이 것 뿐만이 아니라 iterator 종류는 무척 많습니다.
예로써 위의 back_insert_iterator 와 같은 iterator 를 들수 있습니다. 물론 이보다는 std::insert 알고리즘이 더 좋습니다. back_insert_iterator는 해당 객체에 대하여 push_back 함수를 값을 인자로 호출해주는 것을 대행하게 되죠. 이렇게 보니 이전 for 루프에 대하여 출력하기 전 보다 훨씬 가독성도 높아지고 iterator 를 재정의 하면 새로운 부분들도 확장시킬 수 있을것 같다는 생각이 들지 않나요?? Iterator 를 해당 필요상황에 맞게 잘 사용하면 무척 좋겠다는 생각이 듭니다.
그런데 알고보면 이게 오히려 가독성을 떨어트릴 수도 있습니다. 실제로 for 구문에 대하여 모든 것을 인식해야 하고 조건, 증가식등을 알아야 하기 때문이죠. 그에 반해 좋은 방법이 하나 존재합니다. 바로 std::copy 알고리즘을 사용하는 것인데요. 사용법은 바로 아래와 같습니다.
이 것은 std::copy가 begin 에서 부터 end 까지 ( , ] 구간을 std::ostream_iterator 함수 객체에 대하여 = assign 연산을 수행 시켜주는 알고리즘이기 때문에 가능한 것이죠. 물론 함수객체가 아닌 함수 포인터도 가능합니다. 그런데 std::ostream_iterator 가 왜 이렇게 되는지 궁금하지 않나요? iterator 헤더 안에 들어가 검색을 해보니 다음과 같은 소스 부분이 존재하더군요.
바로 선언시 전달 받은 ostream_type을 함수객체의 지역성에 의하여 보관하고 있는 상황에서 해당 객체에 대한 = operator에 의한 Assign 문장이 실행되면 *Myostr 에 << 연산으로 값을 넣게 되는 것입니다. 이 것은 미리 basic_ostream 객체( 예를 들면 cout )에서 미리 정의된 객체에 대하여 << 연산자가 미리 정의 되어있기 때문에 가능한 것이죠. 만약 미리 정의 되지 않았다면 << 연산에 대하여 컴파일 에러가 발생합니다. 이 것 뿐만이 아니라 iterator 종류는 무척 많습니다.
예로써 위의 back_insert_iterator 와 같은 iterator 를 들수 있습니다. 물론 이보다는 std::insert 알고리즘이 더 좋습니다. back_insert_iterator는 해당 객체에 대하여 push_back 함수를 값을 인자로 호출해주는 것을 대행하게 되죠. 이렇게 보니 이전 for 루프에 대하여 출력하기 전 보다 훨씬 가독성도 높아지고 iterator 를 재정의 하면 새로운 부분들도 확장시킬 수 있을것 같다는 생각이 들지 않나요?? Iterator 를 해당 필요상황에 맞게 잘 사용하면 무척 좋겠다는 생각이 듭니다.
"Language" 분류의 다른 글
| boost::spirit - Parser 라이브러리 (0) | 2008/04/23 |
| std::ostreambuf_iterator, std::istreambuf_iterator의 이유 (1) | 2008/04/16 |
| std::auto_ptr - Smart Pointer 이지만?? (1) | 2008/04/13 |
| C# Application - Main 에서 Try-Catch 오작동 해결하는 방법 (4) | 2008/04/07 |
| Boost 1.35 - 워크샵 뒤의 포스팅 (2) | 2008/04/03 |


댓글을 달아 주세요