2010-11-20 2 views
3

일부 레거시 코드를 통합 한 2- 패스 알고리즘을 작성하려고합니다. 특정 컨테이너를 두 번, 한 번 순서대로, 한 번 역순으로 이동하려고합니다. 분명히, 내 생각은 iteratorreverse_iterator을 사용하는 것이지만 이상하게 컨테이너를 사용하는 디자이너는 컨테이너에 대해 reverse_iterator을 정의하는 데 적합하지 않다고 생각했습니다. reverse_iterators 여기 iterators처럼 역 참조 할 수 없습니다. 이미 알고리즘이 reverse_iterator이 필요합니다.C++ reverse_iterator 대안

제 생각에는 알고리즘의 첫 번째 부분에 첫 번째 패스 반복자를 사용하고 알고리즘을 push_front 알고리즘을 새 컨테이너로 실행 한 다음 새 컨테이너를 반복합니다. 이것은 응용 프로그램에서 중요하지 않은 메모리를 차지할 것이지만 C++에서 reverse_iterators에 대한 더 깨끗한 대안이 있습니까? 아니면 전달을 사용하여 알고리즘을 다시 작성해야합니까? iterators?

답변

4

컨테이너의 요소를 역순으로 반복해야하는 경우 반드시 역 반복기를 사용할 필요는 없습니다. 컨테이너가 양방향 반복자가있는 경우

, 당신은 보통의 반복자를 사용하는 대신 begin()에서 end()에 반복 ++it를 사용 end()에서 begin()에 반복 --it를 사용할 수 있습니다. 이 조금 까다 롭습니다 때문에

, 당신은 (이것은 기본적으로 ++-- 스왑이 일하러 가야하는 데 필요한 속임수를 캡슐화) 역 반복자에 일반 반복자를 변환 할 std::reverse_iterator 래퍼를 사용할 수 있습니다.

컨테이너에 양방향 반복기가 없으면 컨테이너의 요소를 역순으로 반복 할 수 없다는 것을 의미합니다.이 경우 알고리즘을 다시 작성하거나 다른 컨테이너를 사용해야합니다.

양방향 반복기가있는 컨테이너이면 이어야합니다.은 역 반복기 기능을 제공해야합니다. 이것은 STL 및 C++ 표준 라이브러리 "컨테이너"개념의 일부입니다.

+0

감사합니다. iterator가 양방향 인 것처럼 보입니다. 클래스는 실제로'std :: reverse_iterator'를 사용하여'reverse_iterator'를 구현합니다. 그러나 그것을 사용하려고 할 때 역 참조를하면 컴파일러 오류가 발생합니다. – Zeke

+1

@ Zeke : 사용중인 코드와 정확한 컴파일러 오류를 게시해야합니다. 그렇지 않으면 도움을주는 것이 어렵습니다. :( –

+0

@James : Fair enough.'--it' 아이디어가 효과적이라고 생각하지만 for 루프 조건에 대한 제안이 있습니까? for (-it; it ! = end; --it)'하지만 마지막 항목이 누락 될 수 있습니다. 루프 본문이 끝난 후 조건을 수정하거나 루프 코드를 포함해야합니까? – Zeke