解析文件

将文件解析为 STL 容器

istream_iterators 对于将数字序列或其他可解析数据读入 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;
});