[英]What happens when std::istream_iterator<int>(std::cin) Equals to the end iterator std::istream_iterator<int>()
[英]vector<int> v(istream_iterator<int>(cin), istream_iterator<int>());
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
using namespace std;
int main()
{
vector<int> v(istream_iterator<int>(cin), istream_iterator<int>()); //Compilation error?!
copy(v.begin(), v.end(), ostream_iterator<int>(cout, "\n"));
return 0;
}
為什么那條線出錯? 我知道編譯器將“ v”作為函數! 驚人...
這個問題被稱為C ++ 最煩人的解析 。
嘗試將第一行更改為以下內容(注意多余的括號):
vector<int> v((istream_iterator<int>(cin)), istream_iterator<int>());
正如@Kyle Lutz所指定的,這是最令人頭疼的解析問題,通常也可以通過將初始化更改為以下內容來解決:
vector<int> v=vector<int> (istream_iterator<int>(cin), istream_iterator<int>());
比“雙重括號技巧”更易於理解。
這里有用作函數參數的函數指針聲明:
int f(int (*funa)());
int f(int funa());
int f(int());//The parameter name can be omitted, such as the function declaration int g(double p); is equal to int g(double);
因此,請看您的問題:
vector<int> v(istream_iterator<int>(cin), istream_iterator<int>());
是的,是的,我們知道istream_iterator<int>(cin)
是istream_iterator<int>
類型的參數。 但是,第二個參數是我們遇到的問題: istream_iterator<int>()
可以理解為指向返回istream_iterator<int>
並且沒有參數的函數的指針。 這使編譯器感到困惑, v
可能是函數聲明或動詞定義。 如果第二個參數不是函數指針,則v
是動詞定義。
我們可以通過兩種方式解決您的問題,首先可以聲明迭代器,然后在v
使用它們:
istream_iterator<int> dataBegin(cin);
istream_iterator<int> dataEnd;
vector<int> v(dataBegin, dataEnd);
解決它的第二種方法是:
vector<int> v((istream_iterator<int>(cin)), istream_iterator<int>());
我們在第一個元素周圍加上()
,它告訴編譯器它是一個動詞,而不是參數,因此第二個元素也必須是一個動詞。 就這樣。
當我嘗試編譯它時,我遇到的唯一錯誤是在下一行,它抱怨v.begin()
和v.end()
無效,因為v
不是類/結構/聯合(對於正如已經指出的那樣,很明顯的原因是您遇到了最煩人的解析)。
如果僅增加一行,則可以避免使用MVP,而且imo的代碼將更具可讀性,並且重復性較低。
istream_iterator<int> b(cin), e;
vector<int> v(b,e);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.