2012-12-27 5 views
7

C++ 11에서 정방향 출력 반복기를 표준 방식으로 정의하는 방법은 무엇입니까?정방향 출력 반복기를 정의하는 정식 방법

표준에 따르면 forward_iterator는 input_iterator입니다. 따라서 해당 forward_iterator_taginput_iterator_tag으로 만 확장됩니다. 반복기를 정의하기 위해 std::iterator을 사용하는 경우, forward-output-iterator에 어떤 태그를 사용합니까?

forward_iterator_tagoutput_iterator_tag을 모두 확장하는 비공개 태그를 정의하는 것이 표준인가, 아니면 더 좋은 해결책이 있습니까?

+0

둘 모두에서 상속받습니다. –

+0

사이드 질문으로 :이 가변적 인 반복자 태그가 표준 라이브러리로 간주되었는지는 누구에게 알 수 있습니까? 그렇다면 왜 포함되지 않았습니까? –

답변

6

할 일은 std::iterator<std::forward_iterator_tag, T>에서만 상속하는 것입니다. 반복자에는 카테고리가 하나만 있습니다.

표준에는 앞으로 이터레이터 인 출력 반복기에 대한 알고리즘 (또는 다른 용도)이 없습니다. 표준에서 출력 반복기를 사용하면 단일 패스 만 있으면됩니다.

대신 표준에는 forward/bidi/randomaccess 카테고리의 변경 가능 대 불변 반복기에 대한 아이디어가 있습니다. 반복기를 통해 작성해야하며 모든 단일 알고리즘보다 더 우수한 알고리즘은 또한 반복 작성자와 동일한 반복자를 통해 읽습니다. 이것은 std::remove, std::sort 및 기타 변경 알고리즘입니다.

반복 가능 태그와 불변 반복자의 차이점은 반복 태그에 의해 감지되지 않으며 할당 표현식이 올바른지 여부에 따라 결정됩니다. 예를 들어, 이터레이터를 std::sort에 전달하면 그 알고리즘은 컴파일되지 않습니다. 따라서 일반적으로 입력 반복기에도 output_iterator_tag 태그가 필요하지 않습니다. OutputIterator을 필요로하는 모든 알고리즘은 ForwardIterator과 같이 사용할 수 있습니다. 다시 output_iterator_tag 태그를 지정할 필요가 없습니다.

표준 알고리즘의 요구 사항과 다른 요구 사항이 있다면 제안을 반복기에서 사용할 수없는 이유를 즉시 생각할 수 없습니다. 그러나 변경 가능한 표준 반복자를 감지하지는 못합니다. 예를 들어 std::deque<int>::iteratorint*은 반복자 범주가 random_access_iterator_tag이고 비공개 태그가 아니며 output_iterator_tag과 아무 관련이 없습니다. 따라서 원하는 정보를 제공하기 위해 기존의 iterator_traits::iterator_category을 적용하기보다는 자신의 특성 클래스를 정의하는 것이 더 나을 것입니다.

+0

감사합니다. 그것은 상당히 많은 것을 정리했다. 결국 이것은 불변의 반복자가 반환 참조를 통해 할당을 막기 위해 pointed 요소의 const 참조/복사본을 반환한다는 것을 의미합니다. 맞습니까? – MFH

+1

@MFH : 맞습니다. 'const T &'를 리턴하는 컨테이너에 대한 불변의 반복자 (실제로 그것이 필요한지, 아니면 대신에 프록시를 돌려 줄 수 있는지는 확인하지 않았다). 다른 불변의 반복자는'T'로 변환 가능한 것을 반환 할 수 있습니다. –