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