STL适配器(ostream_itertor与istream_iterator)

ostream_itertor与istream_iterator

<span style="font-size:18px;">//配接器 
/*
是一种常用设计模式 将一个class的接口转换为另一个class的接口 
使原本因接口不兼容的class可以死一起运作
可应用于容器 迭代器 仿函数等
*/
/*
insert_iterator 重载=运算符 调用insert
back_insert_iterator 重载=运算符 调用push_back
front_insert_iterator 重载=运算符 调用push_front
//以上三种类型均为 out_iterator_tag 
关闭* 前++ 后++ 等功能 重载后只返回*this
他们在数据的插入上运用及其方便


reverse_iterator rbegin() 返回end()前一个位置,rend()返回begin()前一个位置
ostream_iterator  =运算符内功能与<<运算符类似
istream_iterator  =运算符内与>>运算符功能类似
//以上两个迭代器 内部绑定了stream对象 都重载=运算符 关闭其它功能只返回*this
数据输入输出十分方便 代码如下
*/
#include<iostream>
#include<fstream>//文件流
#include<string>
#include<vector>
#include<deque>
#include<cstring>
#include<iterator>
#include<algorithm>
#include<functional>
using namespace std;
template<class T>
void Display(const vector<T>& vec)
{
	copy(vec.begin(), vec.end(), ostream_iterator<T>(cout, " \n"));
	puts("");
}
template<class T>
void print(const T& val)
{
	cout << val << " ";
}
template<class T>
class Show
{
public:
	Show(T val)
	{
		m_val = val;
	}
	void print()const
	{
		cout << m_val << "  ";
	}
private:
	T m_val;
};

int main(void)
{
	int a[] = { 8,9,-7,12,4,36,120,5,1,2,3 };
	int a1[] = { 99,100 };
	int len = sizeof(a) / sizeof(a[0]);
	vector<int> vec(a, a + len);
	vector<int> v1(0, 10);
	ostream_iterator<int> O_ite(cout, " ");
	//istream_iterator<int> I_ite(cin);
	istream_iterator<int> I_eos;//结束标志 ctrl z

	vector<int>::iterator Insite = v1.begin();
	//copy(I_ite,I_eos,Insite);//实现屏幕终端数据输入
	//Display<int>(v1);
	//1 3 5 6 7 8 9 ^ Z
	//1 3 5 6 7 8 9 0 0 0
	v1 = vector<int>(a, a + len);
	copy(v1.rbegin(), v1.rend(), O_ite);//实现数据输出至屏幕终端
	cout << endl;
	deque<int> id(a, a + len);
	deque<int> ia(a1, a1 + sizeof(a1) / sizeof(a1[0]));
	//copy(ia.begin(), ia.end(), front_inserter(id)); //front_insert_iterator
	//100 99 8 9 -7 12 4 36 120 5 1 2 3 实现头插
	//copy(ia.begin(), ia.end(), back_inserter(id));//back_insert_iterator
	//8 9 -7 12 4 36 120 5 1 2 3 99 100 实现尾插
	//上述两个插入函数都可以用insert代替
	copy(ia.begin(), ia.end(), inserter(id, id.begin() + 3));//insert_iterator
	//8 9 -7 99 100 12 4 36 120 5 1 2 3 插入到某一个位置 
	copy(id.begin(), id.end(), O_ite);
	//最后试一下文件流的输入与输出
	puts("\n--------------------------------------");
	ifstream in(".//source.txt", ios_base::in);
	if (!in)
	{
		perror("can not open file!");
	}
	istream_iterator<string> I_in(in);
	//copy(I_in, istream_iterator<string>(), ostream_iterator<string>(cout,"\n"));
	//指定为int 类型 会出现问题 一般用string
	/* 读到换行结束
	515151151651651
	654816584456
	sfrsgrg
	efrsgrg
	15241r
	sfsf
	*/
	in.seekg(0, ios_base::beg);
	vector<string> Strvec;
	copy(I_in, istream_iterator<string>(), inserter(Strvec, Strvec.begin()));
	//将文件中的每一行输入到vector中
	in.close();
	puts("\n--------------------------------------");
	//文件输出流
	ofstream out(".//dst.txt", ios_base::out | ios_base::app);
	if (!out)
	{
		perror("can not open file!");
	}
	ostream_iterator<string> O_out(out, "\n");
	copy(Strvec.begin(), Strvec.end(), O_out);
	/* 这是dst里文件内容
	515151151651651
	515151151651651
	654816584456
	sfrsgrg
	efrsgrg
	15241r
	sfsf
	*/
	out.close();
	//讲一系列数据 输入到数组中 
	puts("请输入数据:");
	//vector<int>v3(istream_iterator<int>(cin), istream_iterator<int>());
	//上面这么写会出问题 注意需要再加一个括号  这也是有意思
	//另外注意一点 字符串使用这种方式不能输入空格
	//vector<int>ivec((istream_iterator<int>(cin)), istream_iterator<int>());
	//copy(ivec.begin(), ivec.end(), ostream_iterator<int>(cout, "\n"));
	
	puts("----------------------------------------");
	//下面看一下 functor dadpters 数量庞大 
	//bind(绑定)  negate(否定)  compose(组合)
	vector<int>v2(a, a + len);
	not1(bind2nd(less<int>(),12));
	//上述 临时对象 意思是不小于12的元素
	/*
	bind1st bind2st 用于绑定某一个参数
	compose1 用于组合两个函数对象但不是C++标准
	*/
	for_each(vec.begin(),vec.end(),ptr_fun(print<int>));
	puts("");
	for_each(vec.begin(), vec.end(), mem_fun_ref(&Show<int>::print));
	//用ptr_fun 修饰一般函数 使之搭配STL算法 一定为常成员函数 并且参数为成员数据
	/*
	两个适配器 豆浆函数指针或者是成员函数指针 作为一个数据成员使用
	*/
	return 0;
}</span>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值