跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C++ 流迭代器
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{Note|本文是C++标准模板库(STL)迭代器系列的一部分,重点介绍流迭代器(Stream Iterators)的概念与应用。}} = C++流迭代器 = '''流迭代器(Stream Iterators)'''是C++标准模板库(STL)中一类特殊的迭代器适配器,用于将输入/输出流当作序列容器来处理。它们允许开发者使用迭代器接口从流中读取数据或向流中写入数据,从而与STL算法无缝集成。 == 核心概念 == 流迭代器分为两种主要类型: * '''istream_iterator''':输入流迭代器,用于从输入流(如<code>cin</code>或文件流)读取数据 * '''ostream_iterator''':输出流迭代器,用于向输出流(如<code>cout</code>或文件流)写入数据 流迭代器的典型特征包括: * 单向迭代(只能前进) * 不提供随机访问能力 * 输入迭代器只能读取,输出迭代器只能写入 == 输入流迭代器(istream_iterator) == 输入流迭代器从输入流中提取数据,其模板声明为: <syntaxhighlight lang="cpp"> template <class T, class charT = char, class traits = char_traits<charT>, class Distance = ptrdiff_t> class istream_iterator; </syntaxhighlight> === 基本用法示例 === <syntaxhighlight lang="cpp"> #include <iostream> #include <iterator> #include <vector> int main() { // 从标准输入读取整数,直到遇到非整数或EOF std::istream_iterator<int> input_it(std::cin); std::istream_iterator<int> eof; // 默认构造表示流结束 std::vector<int> numbers; // 使用流迭代器填充vector while (input_it != eof) { numbers.push_back(*input_it++); } // 输出读取的内容 std::cout << "Read " << numbers.size() << " numbers:\n"; for (int num : numbers) { std::cout << num << " "; } return 0; } </syntaxhighlight> '''输入示例''': <pre> 10 20 30 40 x </pre> '''输出示例''': <pre> Read 4 numbers: 10 20 30 40 </pre> === 工作原理 === * 当创建<code>istream_iterator</code>时,它会立即尝试从流中读取第一个值 * 每次解引用(<code>*</code>)操作返回当前缓存的值 * 递增(<code>++</code>)操作会读取下一个值 * 默认构造的迭代器作为流结束标记 == 输出流迭代器(ostream_iterator) == 输出流迭代器向输出流中插入数据,其模板声明为: <syntaxhighlight lang="cpp"> template <class T, class charT = char, class traits = char_traits<charT>> class ostream_iterator; </syntaxhighlight> === 基本用法示例 === <syntaxhighlight lang="cpp"> #include <iostream> #include <iterator> #include <vector> int main() { std::vector<int> vec = {1, 2, 3, 4, 5}; // 创建输出流迭代器,指定cout为输出流,分隔符为", " std::ostream_iterator<int> output_it(std::cout, ", "); // 使用流迭代器输出vector内容 for (int num : vec) { *output_it++ = num; // 等价于 std::cout << num << ", "; } std::cout << "\n"; return 0; } </syntaxhighlight> '''输出示例''': <pre> 1, 2, 3, 4, 5, </pre> === 工作原理 === * 赋值操作(<code>=</code>)会将值写入输出流 * 递增操作(<code>++</code>)不做实际工作,仅为保持接口一致性 * 可以指定可选的分隔符字符串,在每次写入后输出 == 流迭代器与STL算法结合 == 流迭代器的真正威力在于与STL算法的结合使用: === 文件复制示例 === <syntaxhighlight lang="cpp"> #include <fstream> #include <iterator> #include <algorithm> int main() { std::ifstream input_file("input.txt"); std::ofstream output_file("output.txt"); // 使用流迭代器复制文件内容 std::istream_iterator<char> input_it(input_file); std::istream_iterator<char> eof; std::ostream_iterator<char> output_it(output_file); std::copy(input_it, eof, output_it); return 0; } </syntaxhighlight> === 数值处理管道 === <syntaxhighlight lang="cpp"> #include <iostream> #include <iterator> #include <vector> #include <algorithm> #include <numeric> int main() { // 从标准输入读取双精度数 std::istream_iterator<double> input_it(std::cin); std::istream_iterator<double> eof; // 计算输入数值的平均值 double sum = std::accumulate(input_it, eof, 0.0); int count = std::distance(input_it, eof); std::cout << "Average: " << (sum / count) << "\n"; return 0; } </syntaxhighlight> == 高级应用 == === 自定义类型的流迭代 === 要使自定义类型支持流迭代器,需要重载<code><<</code>和<code>>></code>运算符: <syntaxhighlight lang="cpp"> #include <iostream> #include <iterator> #include <vector> struct Point { double x, y; friend std::istream& operator>>(std::istream& is, Point& p) { return is >> p.x >> p.y; } friend std::ostream& operator<<(std::ostream& os, const Point& p) { return os << "(" << p.x << ", " << p.y << ")"; } }; int main() { std::vector<Point> points; // 从标准输入读取点 std::copy(std::istream_iterator<Point>(std::cin), std::istream_iterator<Point>(), std::back_inserter(points)); // 输出所有点 std::copy(points.begin(), points.end(), std::ostream_iterator<Point>(std::cout, "\n")); return 0; } </syntaxhighlight> '''输入示例''': <pre> 1.0 2.0 3.5 4.2 </pre> '''输出示例''': <pre> (1.0, 2.0) (3.5, 4.2) </pre> == 性能考虑 == * 流迭代器通常比直接流操作稍慢,因为增加了抽象层 * 对于大量数据,考虑使用缓冲区或直接流操作 * 在性能关键代码中应进行基准测试 == 常见错误与陷阱 == 1. '''悬空迭代器''':流被销毁后继续使用关联的流迭代器 2. '''状态检查''':忘记检查流状态可能导致无限循环 3. '''类型不匹配''':流数据类型与迭代器模板参数不匹配 4. '''多次解引用''':输入流迭代器每次解引用都会导致值被读取 == 总结表 == {| class="wikitable" |- ! 特性 !! istream_iterator !! ostream_iterator |- | 方向 || 输入 || 输出 |- | 可解引用 || 是 || 否(但可赋值) |- | 可递增 || 是 || 是(无实际效果) |- | 结束标记 || 默认构造的迭代器 || 无 |- | 典型用途 || 从流读取数据 || 向流写入数据 |} == 进一步学习 == * 结合<code>std::copy</code>和其他STL算法使用流迭代器 * 探索<code>istreambuf_iterator</code>和<code>ostreambuf_iterator</code>处理原始字符流 * 研究如何将流迭代器与并行算法结合使用(C++17及以上) {{Tip|流迭代器是连接STL算法与I/O系统的强大工具,合理使用可以大幅简化代码并提高可读性。}} [[Category:编程语言]] [[Category:C++]] [[Category:C++stl 迭代器]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
模板:Note
(
编辑
)
模板:Tip
(
编辑
)