IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++流迭代器基础 -> 正文阅读

[C++知识库]C++流迭代器基础

这篇文章基于C++primer,参考的

流迭代器是啥

简单理解就是迭代器会把不同流看作特定类型对象的序列

比如:
在这里插入图片描述
感觉和迭代器操作容器是一样的,我感觉也是,先这样理解吧,用着用着就会有了更深刻的理解了。

概述

先要记住:
istream_iterator 读取输入流
ostream_iterator 向输出流写数据

istream_iterator

当创建流迭代器时,必须指定读取的对象的类型;
当使用默认初始化时,我们相当于创建了一个尾后迭代器(相当于 end()) ,这就是一个流对象序列的 起与终
我们要知道 流迭代器使用 流提取运算符 >>,来读取流。也就是说,我们可以用自定义类型使用流迭代器,前提要重载 >>

istream_iterator < int >num(cin) //从cin 读取int数据
istream_iterator< int >obj 尾后迭代器
istream_iterator< string> str(file_name)// 从文件读取string 数据

先来看一下代码:

#include<vector>
using std::vector;

#include<iostream>
using std::cin; using std::cout; using std::endl;

#include<iterator>
using std::istream_iterator;using std::ostream_iterator;
int main() {
	vector<int> vec;
	istream_iterator<int> in_iter(cin);  // read ints from cin
	istream_iterator<int> eof;           // istream end iterator
	
	while (in_iter != eof)
		vec.push_back(*in_iter++);
	ostream_iterator<int> out_iter(cout, " ");
	
	for (auto e : vec)
	//赋值运算符将元素写到cout;可以忽略递增和解引用 
		out_iter = e;  // the assignment writes this element to cout
	cout << endl;

	return 0;
}

这段代码的意思是 从标准输(cin)入读取数据,在将其存入动态数组里
在将其写入(cout)到标准输出

代码体现了一般迭代器的用法:解引用,递增
以下体现了具体用法
(图牌来源:c++primer,目的:方便复习。)
在这里插入图片描述
对于一个绑定到流的迭代器,一旦其关联的流遇到文件结尾或者IO错误,迭代器的值就与尾后的迭代器相等。

我们还可以利用容器的迭代器范围初始化来初始化容器:
我们先创建一个文件,使用文件流,内容为:
在这里插入图片描述
现在可以通过流迭代器初始化容器了

#include<iostream>
#include<fstream>
#include<string>
#include<iterator>
#include<vector>
#include<algorithm> 
using namespace std;
int main(){
      int count=0;//计数器 
	    ifstream in;
	    in.open("a_file.txt");
	    if(in.fail())cout<<"can't open file!"<<endl; 
	   istream_iterator<string>str_it(in);// 从 a_file 中读取 string类型 
	   istream_iterator<string>eof;//尾置迭代器,使用默认初始化 
	   vector<string>vec(str_it,eof);//使用 range 初始化 
	   in.close();
	   //使用 lambda 表达式 
	   for_each(vec.begin(),vec.end(),[&](string s){cout<<s<<" ";++count;if(count%2==0)cout<<endl;	});
	
	return 0;
} 

输出为:
在这里插入图片描述
与我们的文件内容一样,确实很方便有高效。

ostream_iterator

我们可以对定义了 << (插入运算符)的类型,使用 ostream_iterator 迭代器
必须指定输出对象的类型。它还接受第二个参数(可选),使用个子符串,每次输出,都要打印这个字符串。
以下体现了具体用法
(图牌来源:c++primer,目的:方便复习。)
在这里插入图片描述
其实解引用 * 或者 递增 ++ ,对这个迭代器无用,要想输出值 只需使用 = ,
将要输出的绑定到 赋值号左边的对象输出即可。

小技巧:
1, 使用 copy 来遍历容器:

#include<iostream>
#include<fstream>
#include<string>
#include<iterator>
#include<vector>
#include<algorithm>  // copy ()
using namespace std;
int main(){
	vector<string>vec{"hello","vector","ostream_iterator","iterator"};
	ostream_iterator<string>ost(cout," \n");
	copy(vec.begin(),vec.end(),ost);
	
	
	return 0;
}

2,使用 accumulate 来对标准输入的值求和

#include<iostream>
#include<string>
#include<iterator>
#include<vector>
#include<algorithm>
#include<numeric> //accumulate
using namespace std;
int main(){
	istream_iterator<int>in(cin),eof;
	ostream_iterator<int>out(cout);
	out=accumulate(in,eof,0);
	
	return 0;
}

在这里插入图片描述

好了,知识就到这里了。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-15 15:19:21  更:2021-08-15 15:21:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/26 15:44:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计