1

の内容を逆std::find_ifにトラバースするために使用したいと思います。これには、またはからstd::streambufを構築することが含まれます。残念ながら、以下のコード サンプルに示すように、これを実行しようとすると、コンパイル エラーが発生します。どうすればこれを機能させることができますか? 必要に応じて、Boost を使用したソリューションが最適です。std::reverse_iteratorstd::istream_iteratorstd::istreambuf_iterator

#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;
          ^

ご協力いただきありがとうございます!

4

1 に答える 1

4

私の知る限り、入力反復子 (ifstream の反復子など) は逆方向に進むことができないため、逆反復子は使用できません。考えてみると、reverse_iterator (つまり、演算子 ++) の前方は、通常の反復子 (つまり、演算子 --) の後方であるため、通常の反復子が演算子 -- を提供しない場合、それは理にかなっています。 reverse_iterator が存在してはならないのは理にかなっています。

私が思い出したように、イテレータには 3 種類あります。順方向アクセス、双方向アクセス、ランダム アクセスです。順方向は一方向にしか移動できず (どの :P だと思いますか)、双方向は 1 ずつ前後に移動でき、ランダム アクセスは任意の増分で前後に移動できます。

ご覧のとおり、ランダム アクセス イテレータは双方向イテレータ (およびそれ以上) のすべての操作を提供し、双方向イテレータ自体は前方イテレータ (およびそれ以上) のすべての操作を提供します。つまり、順方向イテレーターが必要な場所ではランダム アクセス イテレーターを使用できますが、その逆はできません

この説明から推測できるように、make_reverse_iterator は双方向またはランダム アクセス イテレータのいずれかを必要とする可能性が高く、ifstream はおそらく forward のみを提供するため、テンプレートのインスタンス化は失敗します。

于 2013-07-04T01:33:18.147 に答える