在您的代碼中,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
在此代碼,創建兩個迭代器begin
和end
,都傳遞給std::distance
功能。該功能計算begin
和end
之間的距離。距離只不過是輸入流中的字符串數量,因爲迭代器begin
對來自輸入流的字符串進行迭代,並且end
定義迭代器的結束,其中begin
停止迭代。之所以begin
遍歷字符串是因爲模板參數std::istream_iterator
是std::string
:
std::istream_iterator<std::string> begin(std::cin), end;
//^^^^^^^^^^^
如果您更改爲char
,然後begin
將迭代器來char
,這意味着下面的程序將計數的字符數輸入流:
#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
(而不是char
)。
由於沒有line
類存在於標準庫,我們已經定義一個自己,但有趣的是,我們可以把它空,如下圖所示,以飽滿的工作代碼:
#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
一樣,您也必須定義operator>>
以獲得line
。它由std::istream_terator<line>
類使用。
演示:http://www.ideone.com/iKPA6
我發現它實際上是兩種常見的方式。一個是如他所示,另一個如果遇到EOF或任何其他錯誤,就會慘敗。 –