4

このコードスニペットがあります。istream_iteratorオブジェクトは定義されているだけで使用されていないため、何も実行されず、アプリケーションはすぐに終了することを期待しています。しかし、アプリケーションを実行すると、入力を提供する前にアプリケーションが終了しません。なんで?

ArchLinuxで次のコマンドを使用してコンパイルしています:gcc 4.7.1、コマンド:g ++ -std = c ++ 11 filename.cpp

#include <iterator>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    istream_iterator<char> input(cin);

    return 0;
}
4

4 に答える 4

4

標準に従って、

24.6.1.1istream_iteratorコンストラクタとデストラクタ[istream.iterator.cons]

istream_iterator(istream_type& s);

3-効果インストリームを。で初期化し&sます。は、構築中または最初に参照されるときに初期化される場合があります。

したがって、このプログラムが入力を待機するかどうかは指定されていません。

ただし、他の方法でどのistream_iteratorように実装できるかを理解するのは困難です。24.6.1:1によると、構築後[...]イテレータは値を読み取り、格納しますT。したがって、読み取りが構築時に発生しない場合はoperator *() const、フリーoperator==(const istream_iterator<T> &, const istream_iterator<T> &)で発生する必要があります。したがって、すべてのイテレータの内部状態はである必要がありますmutable

于 2012-09-26T13:23:29.533 に答える
3

おそらく、istreamイテレータはすぐに呼び出しcin >> xて最初のトークンを抽出し、それが最後のイテレータと等しくなるかどうかを判断します。抽出操作は、ストリームが閉じられるか、トークンが抽出されるか、解析の失敗が発生するまでブロックされます。

質問のタイトルが間違っていることに注意してください。宣言し inputただけでなく、定義もしました。あなたのコードが質問を正確に反映しているとしたら、それは言うでしょう

extern istream_iterator<char> input;  // declaration only!

詰まりはありません。

于 2012-09-26T13:19:47.113 に答える
2

ストリームから、すべての値を「取得」できるのは1回だけで、その後は値がなくなります。ただし、イテレータの一般的な必要性は、イテレータをインクリメントせずに値に複数回アクセスすることです。そのため、はistream_iterator構築時に最初の値を抽出し、それを内部値にコピーします。この値は、イテレータを逆参照するときに返されます。これにより、イテレータは入力の最後にあるかどうかを判断し、終了イテレータになることもできます。インクリメントすると、次の値が読み取られます。

于 2012-09-26T13:22:12.633 に答える
0

これを試して:

#include <iostream>
#include <iterator>

using namespace std;

int main()
{
    istream_iterator<int> start(cin);
    istream_iterator<int> itend;

    while( start != itend ) {
        cout << *start << endl;
        start++;
        //Press Enter followed by Control-D on linux to exit the loop
    }

    cout<<"Control-D Pressed "<<endl;
    return 0;
}

于 2019-10-22T11:32:11.030 に答える