簡體   English   中英

向量 <int> V(istream_iterator <int> (cin),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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM