6

入力ストリームに 10 個の値が含まれていることが確実にわかっている場合は、次のコマンドで読み取ることができます。

std::copy_n(std::istream_iterator<T>(input), 10, output);

自分が持っている値の量がわからない場合は、すべてを読み取ることができます

std::copy(std::istream_iterator<T>(input), std::istream_iterator<T>(), output);

私の問題は、最大10 個の値を読み取る方法です。ここでは I/O エラーに対して堅牢にしようとしていますcopy_nが、入力の最後を超えて読み取ろうとし (停止する必要があることを認識していません)、copy10 個の値で停止しないようです。自分で巻く必要がありcopy_at_mostますか?

(まあ、とにかく copy_n について混乱があるようです: std::istream_iterator<> with copy_n() とその友達)

4

2 に答える 2

4

残念ながら、現在、STL アルゴリズムを使用して処理される要素の数を制限する方法は一般にありません。私の個人的な見解では、std::copy()begin と end で区切られた 2 つの範囲を取る必要があります。いずれかの端に到達できない場合、対応する範囲は無制限になります。つまり、どちらかといえば、次のcopy()ように独自のアルゴリズムを展開します。

template <typename InIt, typename OutIt>
std::pair<InIt, OutIt>
copy(InIt init, InIt inend, OutIt outit, OutIt outend) {
    for (; init != inend && outit != outend; ++init, ++outit) {
        *outit = *init;
    }
    return std::make_pair(init, outit);
}

現在の反復子システムを処理するために、出力反復子間の比較は実際には実行できません。したがって、出力反復子の比較には、実際の出力反復子が比較されずにtrue返されるようにするために、実際には少しテンプレート プログラミングが必要です。他のすべてのイテレータ クラスでは、上記のアルゴリズムが機能するはずです (タイプミスが発生していないと仮定します)。

于 2013-09-16T13:20:45.393 に答える
2

カウンターを使用できますcopy_if-残念ながら、それは早期に壊れません。

int count = 0;
std::copy_if(std::istream_iterator<T>(input), std::istream_iterator<T>(), output,
    [&]() { return ++count < 10; });

(単純なforループではなく)アルゴリズムに固執したい場合は、自分でロールバックすることをお勧めします(過去に同様の質問に答えました。)

于 2013-09-16T13:17:21.137 に答える