まず、std::copy
を実際に使用する必要はありません。
vector<string> col((istream_iterator<string>(cin)),
istream_iterator<string>());
これはおそらくコードを理解しやすくするものではありません。
コードがどのように動作するかは、思ったよりもはるかにストレートです。
template <class T>
class istream_iterator {
std::istream *is;
T data;
public:
istream_iterator(std::istream &is) : is(&is) { ++(*this); }
istream_iterator() : is(nullptr) {}
T operator++() { (*is) >> data; return *this; }
T operator++(int) { (*is) >> data; return *this; }
T const &operator*() { return data; }
bool operator !=(istream_iterator &end) { return (*is).good(); }
bool operator ==(istream_iterator &end) { return !(*is).good(); }
};
は明らかに多くの私はスキップてる以上ありますが、それは私たちがここで気に何のほとんどです:istream_iteratorは次のようにぼんやりと見えます。では、イテレータを作成すると、ストリームから項目data
に読み込まれた(またはしようとする)項目が読み込まれます。イテレータを参照解除すると、data
が返されます。イテレーターをインクリメントすると、イテレーターはファイルから次の項目を読み取ります(または試みます)。あるイテレータを別のイテレータと比較しているかのように書かれているにもかかわらず、operator==
とoperator!=
は、実際にはファイルの最後をチェックします。その後、std::copy
で使われています
、漠然とこのようになりますこれは(再び簡体字):だから
template <class InIt, class OutIt>
void std::copy(InIt b, InIt e, OutIt d) {
while (b != e) {
*d = *b;
++b;
++d;
}
}
、これは読み込み、項目入力イテレータから、出力イテレータにその項目を書き込み、およびまで繰り返し現在の位置のイテレータは、入力の最後のイテレータと同じです(ファイルの最後に到達すると発生します)。他のイテレータとは異なり、istreamイテレータで使用できる唯一の "end"位置はファイルの終わりです。
- 技術的には、これは動作が適合していないことに注意してください。物事を単純に保つために比較を単純化しました。 2つのデフォルト構築イテレータは等価を比較する必要があり、同じストリームから2つのイテレータを作成する場合は、少なくともストリームから何かを読み込む前にequalを比較する必要があります。実際の使用で見られる唯一の比較は、あなたがまだファイルの終わりに達しているかどうかを判断することです。
"The C++ STL" –