解析檔案

將檔案解析為 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;
});