2013-09-22 98 views
3

我想使用流迭代器從控制檯讀取和輸出單詞。這裏是我的嘗試:C++流迭代器

#include <iostream> 
#include <string> 
#include <vector> 
#include <algorithm> 
#include <iterator> 

using namespace std; 

int main() 
{ 
    vector<string> stringVec; 

    copy(istream_iterator<string>(cin), istream_iterator<string>(), back_inserter(stringVec)); 

    sort(stringVec.begin(), stringVec.end()); 

    unique_copy(stringVec.cbegin(), stringVec.cend(), ostream_iterator<string> (cout, "\n")); 

    return 0; 
} 

當我輸入「這是它」並按回車鍵在控制檯,那裏閃爍保持光標(表明它在等待輸入)。

任何人都可以提供一些見解我的方法嗎?

在此先感謝。

回答

1

讓輸入你的情況,你可以使用getlineistringstream。它讀取一個字符串直到\n,然後將其傳遞給複製。在一天

#include <iostream> 
#include <string> 
#include <vector> 
#include <algorithm> 
#include <sstream> 

... 

vector<string> stringVec; 

string str; 
getline(cin, str); 
istringstream ss(str); 

copy(istream_iterator<string>(ss), 
    istream_iterator<string>(), 
    back_inserter(stringVec)); 

sort(stringVec.begin(), stringVec.end()); 

unique_copy(stringVec.cbegin(), 
      stringVec.cend(), 
      ostream_iterator<string> (cout, "\n")); 

兩個同樣的問題,你可以閱讀this

+0

我需要使用getline作爲解決方法嗎? – Roy

+0

我不能說你要使用它,但它是一種簡單而標準的方式。你也可以用任何自定義流來替換'cin'。 – deepmax

+0

謝謝。上面的代碼不會在我身上編譯。 VS表示以下錯誤: IntelliSense:沒有構造函數的實例「std :: istream_iterator <_Ty,_Elem,_Traits,_Diff> :: istream_iterator [使用_Ty = std :: string,_Elem = char,_Traits = std :: char_traits ,_Diff = ptrdiff_t]「匹配參數列表 參數類型爲:(std :: istringstream)」 – Roy

1

您需要爲istream_iterator<string>()提供一個EOF,它構造了流結束迭代器。

使用按Ctrl + ZF6或(按Ctrl + d在Linux上),以阻止流

+0

您可否詳細說明如何提供EOF替換istream_iterator ()?這實際上直接來自Nicolai書(C++標準庫)的代碼。 – Roy

+0

@ Genius101'istream_iterator ()'等待'EOF',它可以用上面的鍵給出。否則,您可能需要使用循環將字符串添加到矢量中。 – P0W

+0

我試過了,但它不起作用。我在Windows中使用VS2012。我猜想上面的作品在你身邊? – Roy