2013-07-04 48 views
0

我想用std::find_if遍歷std::streambuf的內容相反。這包括從std::istream_iteratorstd::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的)不能夠倒退這就是爲什麼反向迭代不可用。這是有道理的,因爲如果你考慮它,reverse_iterator(即operator ++)的前向是正常迭代器(即operator - )的後面,所以如果正常迭代器不提供operator - ,那麼它堅持認爲reverse_iterator不應該存在。

我記得有3種類型的迭代器:前進,雙向和隨機訪問。前進只能朝一個方向(猜測哪個:P),雙向可以前進和後退1,並且隨機訪問可以前進和後退任何增量。

正如你可以看到隨機訪問迭代器提供了雙向迭代(及以上)誰自己提供前向迭代器(及以上)的所有操作的所有操作。這意味着隨機訪問迭代器可以用於需要前向迭代器的地方,但反過來,不是

正如你可能已經從這個解釋make_reverse_iterator猜測最有可能要求或者雙向或隨機訪問迭代器和ifstream的最有可能只提供前進這就是爲什麼模板實例失敗。

+0

嗯,我認爲'std :: istream_iterator'可以通過'sungetc'支持'operator - '。 Boost是否提供了一個類似的接口,可以用來向後迭代'std :: streambuf'? –

+0

我真的不知道增強是否提供了這樣的東西,但它是一個很好的地方看,如果有人提供它會是他們。另外,對於'sungetc' * *我認爲*只適用於最後一個字符的閱讀,所以你可以做一次,然後你必須再次開始前進。 – Borgleader