#include <iterator>
//自定义STL兼容的插入器,实现过滤器的程序
template <class Container,class Functor>
class filter_back_insert_iterator
: public std::iterator<std::output_iterator_tag,typename Container::value_type>
{
protected:
typedef typename Container::value_type value_type;
Container& container;
Functor&_functor;
public:
filter_back_insert_iterator(Container& x,Functor& f) : container(x),_functor(f) {}
filter_back_insert_iterator<Container,Functor>&
operator=(const value_type& value) {
if(_functor(value)) container.push_back(value);
return *this;
}
filter_back_insert_iterator<Container,Functor>& operator*() { return *this; }
filter_back_insert_iterator<Container,Functor>& operator++() { return *this; }
filter_back_insert_iterator<Container,Functor>& operator++(int) { return *this; }
};
//为了便利使用而写的一个辅助函数
template <class Container,class Functor>
filter_back_insert_iterator<Container,Functor> filter_back_inserter(Container& x,Functor f) {
return filter_back_insert_iterator<Container,Functor>(x,f);
}
//下面是测试程序
#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;
//从原始数组中过滤出奇数部分
std::copy(v.begin(),v.end(),filter_back_inserter(odd,Odd()));
//从原始数组中过滤出偶数部分
std::copy(v.begin(),v.end(),filter_back_inserter(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
*******************************************************************************/
//用同样的方法很容易写出另外两个过滤器模板类
//filter_front_insert_iterator和filter_insert_iterator
//两个辅助函数
//filter_front_inserter和filter_inserter
自定义STL插入器实现过滤器
最新推荐文章于 2008-02-05 12:51:00 发布