自定义STL插入器实现分流器

#include <iterator>
//自定义STL兼容的插入器,实现分流器的程序
template <class Container,class Functor1,class Functor2>
class distribute_back_insert_iterator
: public std::iterator<std::output_iterator_tag,typename Container::value_type>
{
protected:
typedef typename Container::value_type value_type;
Container& container1;
Container& container2;
Functor1&_functor1;
Functor2&_functor2;
public:
distribute_back_insert_iterator(Container& x1,Functor1& f1,Container& x2,Functor2& f2)
: container1(x1),_functor1(f1),container2(x2),_functor2(f2) {}
distribute_back_insert_iterator<Container,Functor1,Functor2>&
operator=(const value_type& value) {
if(_functor1(value)) container1.push_back(value);
if(_functor2(value)) container2.push_back(value);
return *this;
}
distribute_back_insert_iterator<Container,Functor1,Functor2>& operator*() { return *this; }
distribute_back_insert_iterator<Container,Functor1,Functor2>& operator++() { return *this; }
distribute_back_insert_iterator<Container,Functor1,Functor2>& operator++(int) { return *this; }
};
//为了便利使用而写的一个辅助函数
template <class Container,class Functor1,class Functor2>
distribute_back_insert_iterator<Container,Functor1,Functor2>
distribute_back_inserter(Container& x1,Functor1 f1,Container& x2,Functor2 f2) {
return distribute_back_insert_iterator<Container,Functor1,Functor2>(x1,f1,x2,f2);
}

//下面是测试程序
#include <iostream>
#include <algorithm>
#include <numeric>
#include <vector>
struct Odd {bool operator()(const int&i){return i%2!=0;}};
struct Even{bool operator()(const int&i){return i%2==0;}};
int main()
{
std::vector<int> v(5);
std::fill(v.begin(),v.end(),1);//[1,1,1,1,1]
std::partial_sum(v.begin(),v.end(),v.begin());//[1,2,3,4,5]
std::cout << "原始数组:" ;
std::copy(v.begin(),v.end(),std::ostream_iterator<int>(std::cout," "));
std::vector<int> odd,even;
//从原始数组中分流出奇数部分到odd分流出偶数部分到even
std::copy(v.begin(),v.end(),distribute_back_inserter(odd,Odd(),even,Even()));
std::cout << std::endl << "奇数部分:" ;
std::copy(odd.begin(),odd.end(),std::ostream_iterator<int>(std::cout," "));
std::cout << std::endl << "偶数部分:" ;
std::copy(even.begin(),even.end(),std::ostream_iterator<int>(std::cout," "));
return 0;
}

//运行输出结果如下:
/*******************************************************************************
原始数组:1 2 3 4 5
奇数部分:1 3 5
偶数部分:2 4
*******************************************************************************/

//用同样的方法很容易写出另外两个分流器模板类
//distribter_front_insert_iterator和distribute_insert_iterator
//两个辅助函数
//distribter_front_inserter和distribter_inserter
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值