我想将文本文件中的所有行加载到 vector<string
中通过使用其范围构造函数,然后通过 cout
输出它们:
#include<iostream>
#include<fstream>
#include<vector>
#include<iterator>
using namespace std;
int main()
{
ifstream file("file.txt");
vector<string> strings(istream_iterator<string>(file) , istream_iterator<string>());
for(auto s : strings)
cout << s << endl;
return 0;
}
当尝试编译上面的代码时,我遇到了几个错误,例如:
error: no matching function for call to ‘begin(std::vector<std::basic_string<char> > (&) (std::istream_iterator<std::basic_string<char> >, std::istream_iterator<std::basic_string<char> > (*) ()))’
for(auto s : strings)
^
还有其他几个……
我想我在这里遗漏了一些明显的东西,有人可以帮忙吗?
最佳答案
您已成为最令人烦恼的解析的受害者,编译器将您的声明视为函数 strings
返回 vector<string>
,采用两个参数:
- 一个
istream_iterator<string>
称为file
- 一个未命名的函数指针,它不带任何参数并返回一个
istream_iterator<string>
.
为了消除烦人的解析,在第一个参数周围使用一对额外的括号:
vector<string> strings((istream_iterator<string>(file)) , istream_iterator<string>());
// ^ ^
或者,在 C++11 中,对 strings
使用花括号构造函数
vector<string> strings{istream_iterator<string>(file) , istream_iterator<string>()};
// ^ ^
注意:Clang 通过-Wvexing-parse
向您发出警告(默认开启)。
关于c++ - 如何正确使用 vector 范围构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24101290/