コードでは、cin >> s
は入力ストリームからstd::string
を読み込もうとします。試行が成功すると、戻り値cin >> s
は暗黙的にtrue
に変換され、whileループは継続してカウンタをインクリメントします。それ以外の場合は、入力ストリームから読み取るデータがなくなるため、試行が失敗するとwhileループが終了します。以下に示すようにあなたは、単語をカウントするstd::distance
を使用することができます
:
#include <iostream>
#include <algorithm>
#include <iterator>
#include <string>
int main() {
std::istream_iterator<std::string> begin(std::cin), end;
size_t count = std::distance(begin, end);
std::cout << count << std::endl;
return 0;
}
デモ:このコードでhttp://www.ideone.com/Hldz3
を、あなたはstd::distance
機能の両方を渡し、2回の反復子begin
とend
を作成します。この関数は、begin
とend
の間の距離を計算します。この距離は入力ストリームの文字列の数だけです。反復子begin
は入力ストリームからの文字列を反復処理するため、は反復子の末尾を定義します。begin
が反復を停止します。
std::istream_iterator<std::string> begin(std::cin), end;
//^^^^^^^^^^^
あなたはchar
にこれを変更する場合は、begin
は、次のプログラムはの文字数をカウントすることを意味しており、char
のIteratorます:std::istream_iterator
にテンプレート引数がstd::string
あるので、文字列の上にbegin
繰り返し処理がある理由入力ストリーム:
#include <iostream>
#include <algorithm>
#include <iterator>
int main() {
std::istream_iterator<char> begin(std::cin), end;
size_t count = std::distance(begin, end);
std::cout << count << std::endl;
return 0;
}
デモ:http://www.ideone.com/NH52y
シム同様に、<iterator>
ヘッダのイテレータと<algorithm>
ヘッダの汎用関数を使用し始めると、多くのクールなことができます。
たとえば、入力ストリーム内の行数を数えたいとします。だから、上記のプログラムを変更して仕事を完了させるのですか?文字数をカウントするときにstd::string
からchar
に変更する方法は、今すぐline
(の代わりに)を反復できるように、それをline
に変更する必要があることをすぐに示唆しています。
何line
クラスが標準ライブラリに存在しないように、我々は1に自分自身を定義するためにきた、しかし興味深いのは、以下に示すように、我々は完全な作業コードで、空のそれを保つことができるということです。
#include <iostream>
#include <algorithm>
#include <iterator>
#include <string>
struct line {}; //Interesting part!
std::istream& operator >>(std::istream & in, line &)
{
std::string s;
return std::getline(in, s);
}
int main() {
std::istream_iterator<line> begin(std::cin), end;
size_t count = std::distance(begin, end);
std::cout << count << std::endl;
return 0;
}
はい、line
と一緒にline
にもoperator>>
を定義する必要があります。これは、std::istream_terator<line>
クラスで使用されています。
デモ:http://www.ideone.com/iKPA6
私はそれが実際に2つの一般的な方法を見つける。 1つは彼が示しているように、もう1つはEOFや他のエラーに早く遭遇すると悲惨に失敗します。 –