2

誰かがこれらの質問をしなければならなかったと思いますので、ご容赦ください。

次の獣について考えてみましょう。

  • ストリーム
  • iストリーム
  • iostream
  • ストリームバッファ
  • string - Benjamin の観察によると、これはここには属しません。
  • 文字列バッファ

および次の反復子:

  • ostream_iterator
  • ostreambuf_iterator
  • istream_iterator
  • istreambuf_iterator

質問:

iostream_iterator, streambuf_iterator, string_iterator(std::string::iterator と std::string::const_iterator が存在する) またはがないのはなぜstringbuf_iteratorですか?

上記の 4 つのイテレータに のような const バージョンがないのはなぜstd::vector<T>::const_iteratorですか?

begin() メソッドと end() メソッドが提供されていない場合、これらの獣のいずれかをどのように反復処理する必要があるでしょうか? 上記の 4 つの反復子の目的は何ですか?

N00b 質問: これらのクラスの背後にあるロジックの詳細と、それらの使用方法に関するいくつかの適切な例を詳しく説明している適切なリファレンスはどこにありますか?

うまくいけば、経験のある人が上記の質問に対して適切な答えを提供します。


PS: 実際の状況:

void writeToStream(std::ostream &out);
int main ()
{
    std::ostringstream byteStream;
    writeToStream(byteStream);
    std::string byteString = byteStream.str();

    for (unsigned short i = 0; i < byteString.size(); ++i)
    {
        //do something with each byteString[i]
    }
    return 0;
}

私の推測では、メソッドを使用して for に変換する代わりに、ostreamfor と同じようにイテレータを使用してその要素を使用および反復できたはずですが、これに関する情報は見つかりませんでした。std::vectorostringstreamstr()string

4

3 に答える 3

4

何もない理由:
* iostream_iterator
* streambuf_iterator

わからない。おそらく、入力と出力の両方を行う場合、セマンティクスを定義するのが難しいためです。イテレータを使用してストリームを前方に移動してから後方に移動すると、何が起こると思いますか?

  • string_iterator
  • stringbuf_iterator?

これらは、既存のイテレータで簡単にカバーできます。

std::string                  line; // load line.
std::stringstream            linestream(line);
std::istream_iterator<int>   lineIterator(linestream);

上記の 4 つの反復子に std::vector::const_iterator のような const バージョンがないのはなぜですか?

ストリームを反復処理すると、ストリームの状態が変化するためです。

begin() メソッドと end() メソッドが提供されていない場合、これらの獣のいずれかをどのように反復処理する必要があるでしょうか? 上記の 4 つの反復子の目的は何ですか?

ストリームは通常一方向だからです。最初から反復するのではなく、ストリーム内の現在の位置から最後まで反復します。したがって、ストリームを指定する反復子を宣言するだけです。イテレータは現在の位置から始まり、最後に向かって移動します。ストリームを指定しないだけで、ストリーム終了イテレータを宣言できます。

 std::istream_iterator<int>   loop(std::cin);
 for(;loop != std::istream_iterator<int>(); ++loop)
 {
     std::cout << *loop;
 }

N00b 質問: これらのクラスの背後にあるロジックと、それらの使用方法に関するいくつかの適切な例を詳しく説明している適切なリファレンスはどこにありますか?

ここがいいところです。
「C++ istream_iterator」で検索すると、たくさんヒットします。

うまくいけば、経験のある人が上記の質問に対して適切な答えを提供します。

うまくいけば。

于 2012-08-09T21:50:39.343 に答える
3

iostream_iterator、streambuf_iterator、stringbuf_iterator がないのはなぜですか?

知らない。それは単純に、それらがより複雑になり、十分な需要がないからだと思いますが。

上記の 4 つのイテレータに のような const バージョンがないのはなぜ std::vector<T>::const_iteratorですか?

const 入力イテレータはかなり冗長です。とにかく、それらから読み取ることはできますが、それらに書き込むことはできません。const 出力反復子は、出力するという唯一の目的を破壊するため、無意味です。

begin() メソッドと end() メソッドが提供されていない場合、これらの獣のいずれかをどのように反復処理する必要があるでしょうか? 上記の 4 つの反復子の目的は何ですか?

それぞれのコンストラクターでイテレーターを作成することにより、例えば

std::istream_iterator<int> in_begin(std::cin), in_end;
std::ostream_iterator<int> out_begin(std::cout, "\n");
std::copy(in_begin, in_end, out_begin);

終了イテレータ foristream_iteratorは、そのコンストラクタに引数を渡さないだけで作成されることに注意してくださいend()。出力イテレータの for に相当するものはありません。

于 2012-08-09T21:46:43.443 に答える
1

これらのストリーム イテレータは、標準のアルゴリズムを使用して、コンテナーとの間で直接、ストリームへの書き込み/ストリームからの読み取りを行うために存在します。だから書く代わりに

for (vector<int>::iterator i=v.begin(); i!=v.end(); ++i)
    cout << *i <<"\n";

std::copy: を使用できます。

copy(v.begin(), v.end(), ostream_iterator(cout, "\n"));

参考までに、this、またはTC++PLのようなものを確認してください。IMHO は巧妙なトリックですが、入力/出力をほとんど制御できないため、実際にはあまり役に立ちません。

于 2012-08-09T21:39:08.640 に答える