繁体   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