std::istream_iterator
| 在標頭 <iterator> 定義
|
||
| |
(C++17 前) | |
| |
(C++17 起) | |
std::istream_iterator 是一種單趟輸入迭代器,通過調用適當的 operator>>,從為之創建迭代器的 std::basic_istream 對象讀取 T 類型的相繼對象。實際讀取操作在自增,而非解引用迭代器時進行。在構造迭代器時讀取首個對象。解引用只返回最近讀取的對象的副本。
默認構造的 std::istream_iterator 被稱為流尾迭代器。有效的 std::istream_iterator 抵達底層流尾時,它變得等於流尾迭代器。解引用和進一步自增它導致未定義行為。流尾迭代器在生存期結束前保持流尾狀態,它無法再變成非流尾迭代器。
std::istream_iterator 的典型實現保有兩個數據成員:指向關聯 std::basic_istream 對象的指針和最近讀取的 T 類型的值。
T 必須滿足可默認構造 (DefaultConstructible) 、可複製構造 (CopyConstructible) 和可複製賦值 (CopyAssignable) 要求。
成員類型
| 成員類型 | 定義 |
iterator_category
|
std::input_iterator_tag
|
value_type
|
T
|
difference_type
|
Distance
|
pointer
|
const T*
|
reference
|
const T&
|
char_type
|
CharT
|
traits_type
|
Traits
|
istream_type
|
std::basic_istream<CharT, Traits>
|
|
要求通過從 |
(C++17 前) |
成員函數
構造新的 istream_iterator (公開成員函數) | |
析構 istream_iterator,包括緩衝的值 (公開成員函數) | |
| 返回當前元素 (公開成員函數) | |
| 推進迭代器 (公開成員函數) |
非成員函數
(C++20 移除) |
比較兩個 istream_iterator (函數模板) |
註解
讀字符時,std::istream_iterator 默認跳過空白(除非用 std::noskipws 或等價物禁用,而 std::istreambuf_iterator 不跳過。另外,std::istreambuf_iterator 更有效率,因為它避免對每個字符構造並析構一次 sentry 對象的開銷。
示例
#include <algorithm>
#include <iostream>
#include <iterator>
#include <numeric>
#include <sstream>
int main()
{
std::istringstream str("0.1 0.2 0.3 0.4");
std::partial_sum(std::istream_iterator<double>(str),
std::istream_iterator<double>(),
std::ostream_iterator<double>(std::cout, " "));
std::istringstream str2("1 3 5 7 8 9 10");
auto it = std::find_if(std::istream_iterator<int>(str2),
std::istream_iterator<int>(),
[](int i){ return i % 2 == 0; });
if (it != std::istream_iterator<int>())
std::cout << "\n第一个偶数是 " << *it << "。\n";
// " 9 10" 留在流中
}
輸出:
0.1 0.3 0.6 1
第一个偶数是 8。
缺陷報告
下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。
| 缺陷報告 | 應用於 | 出版時的行為 | 正確行為 |
|---|---|---|---|
| P0738R2 | C++98 | 首次讀取可以延遲到首次解引用 | 一定會在構造函數中進行 |
參閱
| 寫入 std::basic_ostream 的輸出迭代器 (類模板) | |
| 從 std::basic_streambuf 讀取的輸入迭代器 (類模板) |