4

次のように、事前にベクトルのコンストラクター引数にstd::cin使用して、読み取られた要素の量をカウントしようとしています。std::distance

// Gives correct amount, but now can't use to put into vector
int size = std::distance(std::istream_iterator<std::string>(std::cin),
        std::istream_iterator<std::string>());

std::vector v(size);

// Already read from stream
std::copy(...);

明らかに、これを で 1 ステップで完了することができますstd::copyが、それには事前にサイズを設定する必要があります。私の質問はベクトルに関するものではなくstd::istream_iterator、ストリームに影響を与えずに使用して任意の入力のサイズを取得することです。何か案は?

4

1 に答える 1

7

std::istream_iteratorは ですInputIterator。つまり、反復している範囲で 1 つのパスのみをサポートします。サイズを把握してから、最初に戻ってデータを読み取る方法はありません。

サイズを事前に知らなくても をstd::cin使用して (または他の入力ストリーム)から読み取ることができます。std::copystd::back_insertervector

std::vector v;
std::copy( std::istream_iterator<std::string>(std::cin), 
           std::istream_iterator<std::string>(),
           std::back_inserter(v) );
于 2013-05-04T10:51:02.723 に答える