#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
自定义STL插入器实现分流器
最新推荐文章于 2022-08-03 11:33:08 发布