2013-07-04 3 views
0

std::find_if을 사용하여 역순으로 std::streambuf의 내용을 트래버스합니다. 여기에는 std::istream_iterator 또는 std::istreambuf_iterator에서 std::reverse_iterator을 생성하는 과정이 포함됩니다. 불행히도 아래 코드 샘플에서 볼 수 있듯이이 작업을 시도하면 컴파일 오류가 발생합니다. 어떻게 작동시킬 수 있습니까? 필요한 경우 Boost를 사용하는 솔루션이 유용 할 것입니다.역순으로 스트림 반복

다음
#include <cstddef> 
#include <fstream> 
#include <iterator> 

template <class Iterator> 
static std::reverse_iterator<Iterator> 
make_reverse_iterator(Iterator i) 
{ 
    return std::reverse_iterator<Iterator>(i); 
} 

int main() 
{ 
    std::ifstream is{"foo.txt", std::ios::binary}; 
    std::istreambuf_iterator<char> i{is}; 
    auto r = make_reverse_iterator(i); 
    // Error =(
    *r; 
    return EXIT_SUCCESS; 
} 

은 컴파일 오류가 g++-4.8.1에 의해보고 : 당신의 도움에 대한

In file included from /opt/local/include/gcc48/c++/bits/stl_algobase.h:67:0, 
       from /opt/local/include/gcc48/c++/bits/char_traits.h:39, 
       from /opt/local/include/gcc48/c++/ios:40, 
       from /opt/local/include/gcc48/c++/istream:38, 
       from /opt/local/include/gcc48/c++/fstream:38, 
       from ri.cpp:9: 
/opt/local/include/gcc48/c++/bits/stl_iterator.h: In instantiation of 'std::reverse_iterator<_Iterator>::reference std::reverse_iterator<_Iterator>::operator*() const [with _Iterator = std::istream_iterator<char>; std::reverse_iterator<_Iterator>::reference = const char&]': 
ri.cpp:24:3: required from here 
/opt/local/include/gcc48/c++/bits/stl_iterator.h:163:10: error: no match for 'operator--' (operand type is 'std::istream_iterator<char>') 
    return *--__tmp; 
     ^

감사합니다!

+0

컴파일 오류가 무엇인가요? – Borgleader

+0

@Borgleader 컴파일 오류를 포함하도록 질문을 편집했습니다. –

+0

스트림을 역방향으로 반복 하시겠습니까? 모든 스트림이 "되감기"할 수있는 것은 아니기 때문에 매우 일반적인 방법이 있다고 생각합니다. – John3136

답변

4

입력 반복자 (예 : ifstreams의 iterator)가 역방향으로 진행할 수없는 이유는 역방향 반복기를 사용할 수없는 이유입니다. 그것은 당신이 그것에 대해 생각한다면 reverse_iterator의 forward (ie operator ++)가 정상적인 iterator (ie operator -)의 뒤쪽이므로 보통 iterator가 연산자를 제공하지 않는다면 reverse_iterator가 존재해서는 안되는 이유입니다.

전방, 양방향 및 임의 액세스의 세 가지 유형의 반복기가 있습니다. 전달은 한 방향으로 만 갈 수 있습니다 (추측 : P). 양방향은 1 씩 앞뒤로 갈 수 있고 무작위 액세스는 어떤 증분으로도 앞뒤로 갈 수 있습니다.

무작위 액세스 반복자는 양방향 반복기 (및 기타)의 모든 작업을 제공하므로 누가 순방향 반복기 (및 기타)의 모든 작업을 제공하는지 알 수 있습니다. 즉, 순방향 반복자가 필요하지만 임의의 접근 반복자가 필요하지만, 이 아니라면이 아닌 다른 방법으로 사용할 수 있습니다.

이 설명에서 알 수 있듯이 make_reverse_iterator는 양방향 또는 임의 액세스 반복기가 필요할 가능성이 높으며 ifstream은 대부분 전달 만 제공하므로 템플릿 인스턴스화가 실패합니다.

+0

아, 나는'std :: istream_iterator'가'sungetc'를 통해 가능한 경우'operator -'를 지원한다고 생각했습니다. Boost는'std :: streambuf'를 역순으로 반복 할 수있는 비슷한 인터페이스를 제공합니까? –

+0

나는 부스트가 그런 것을 제공하는지 솔직히 알지 못한다. 그러나 누군가가 그것을 제공한다면 그것은 볼만한 좋은 곳이다. 또한,'sungetc' *에 대해서 * 나는 마지막 문자를 읽을 때만 작동하므로 한번만 할 수 있습니다. 그러면 앞으로 다시 시작해야합니다. – Borgleader