解析文件
将文件解析为 STL 容器
istream_iterator
s 对于将数字序列或其他可解析数据读入 STL 容器非常有用,而代码中没有显式循环。
使用显式容器大小:
std::vector<int> v(100);
std::copy(std::istream_iterator<int>(ifs), std::istream_iterator<int>(),
v.begin());
或插入迭代器:
std::vector<int> v;
std::copy(std::istream_iterator<int>(ifs), std::istream_iterator<int>(),
std::back_inserter(v));
请注意,输入文件中的数字可以除以任意数量的任何空格字符和换行符。
解析异构文本表
由于 istream::operator>>
读取文本直到空白符号,因此可以在 while
条件中使用它来解析复杂数据表。例如,如果我们在每行上有一个带有两个实数的文件后跟一个字符串(不带空格):
1.12 3.14 foo
2.1 2.2 barr
它可以解析如下:
std::string s;
double a, b;
while(ifs >> a >> b >> s) {
std::cout << a << " " << b << " " << s << std::endl;
}
转型
任何范围操作函数都可以与 std::istream_iterator
范围一起使用。其中之一是 std::transform
,它允许即时处理数据。例如,让我们读取整数值,将它们乘以 3.14 并将结果存储到浮点容器中:
std::vector<double> v(100);
std::transform(std::istream_iterator<int>(ifs), std::istream_iterator<int>(),
v.begin(),
[](int val) {
return val * 3.14;
});