2011-11-24 188 views
3

在Boost的第一個示例中,使用了in(std::cin)。我認爲in()得到一個istream並創建某種迭代器。但是,我找不到任何詳細解釋它的C++文檔。你能幫我找到一個嗎?:這是什麼意思?

這裏的例子來自Boost網頁複製和粘貼:

#include <boost/lambda/lambda.hpp> 
#include <iostream> 
#include <iterator> 
#include <algorithm> 

int main() 
{ 
    using namespace boost::lambda; 
    typedef std::istream_iterator<int> in; 
    std::for_each(
    in(std::cin), in(), std::cout << (_1 * 3) << " "); 
} 

回答

1

請注意,在代碼中的typedef:

typedef std::istream_iterator<int> in; 

因此,in(...)是一樣的std::istream_iterator<int>(...):它調用該類型的構造。有一個1參數的構造函數接受std::istream,創建一個代表該流中當前點的迭代器;和一個0參數的構造函數來創建一個代表任何給定流結束的迭代器。因此,std::for_each將從現在開始遍歷std::cin提供的每個值,直到耗盡爲止。

std::istream_iterator<int>需要一個流,並提供一個迭代器通過流中的int s,使用operator>>將它們從流中讀出。

但是,我找不到任何詳細解釋它的C++文檔。

我不知道你怎麼可能失敗。我將std::istream_iterator<int>放入Google,第一個結果是http://www.sgi.com/tech/stl/istream_iterator.html,這是非常徹底的,假設您已經熟悉迭代器。接下來的結果是http://www.cplusplus.com/reference/std/iterator/istream_iterator/,這是另一個嘗試解釋的東西,也是完全詳細的。接下來是http://stdcxx.apache.org/doc/stdlibref/istream-iterator.html,類似地,最後明確提到operator>>,而不是僅僅談論格式化的I/O操作(這是operator>>所做的)。接下來是帶有一些C++示例代碼片斷的頁面,然後是幾個StackOverflow問題,其中人們試圖做類似的事情等等......

+0

感謝您的評論。我的意思是我找不到「in()」的任何文檔。 – iampat

9

in只是爲std::istream_iterator<int>這樣的例子只是由兩個臨時迭代器定義的「範圍」,呼籲std::for_each一個typedefstd::istream_iterator<int>(std::cin)std::istream_iterator<int>()

價值初始化的istream_iterator只是一個通用的「結束」流的迭代器。

std::cout << (_1 * 3) << " "如何工作更微妙。因爲_1來自boost::lambda名稱空間,所以它確保使用來自boost::lambda名稱空間的運算符*,然後使用<<,而不是直接在std::ostream上執行動作的operator<<。這樣整個表達式就變成了lambda,而不是(它的任何部分)作爲for_each的呼叫站點的常規表達式來執行。

+0

我喜歡你如何_tried_在一個段落中濃縮lambda的概念。我非常肯定,蒼蠅 - 嗖嗖 - 在OP的頭頂上,但嘗試的榮譽,和_not-failing_在這個過程中:) +1 – sehe

+0

+1好的解釋。 –

4

你這裏定義它:

typedef std::istream_iterator<int> in; 

因此in(std::cin)是在整數的迭代器,通過使用std::for_each,從標準輸入(CIN)讀取和乘以3它們並打印出來。