<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>