#include <iostream>
#include <algorithm>
#include <numeric>
#include <iterator>
#include <functional>
#include <cmath>
template<class T,class Generator>
class virtual_iterator:public std::iterator<std::forward_iterator_tag,T>
{
public:
typedef T value_type;
virtual_iterator(size_t const&i):_i(i){}
value_type& operator*()
{
return _value=_generator(_i);
}
const value_type& operator++()
{
_i++;return _value=_generator(_i);
}
const value_type& operator++(int)
{
_i++;
return _value=_generator(_i);
}
bool operator==(const virtual_iterator& other) const
{
return _i == other._i;
}
bool operator!=(const virtual_iterator& other) const
{
return _i != other._i;
}
private:
size_t _i;
value_type _value;
Generator _generator;
};
struct Sin { double operator()(const size_t&i) { return sin(i); } };
struct Cos { double operator()(const size_t&i) { return cos(i); } };
template<class T,class Generator>
void display(virtual_iterator<T,Generator>&begin,virtual_iterator<T,Generator>&end,const char*str)
{
std::cout << str ;
std::copy(begin,end,std::ostream_iterator<T>(std::cout," "));
std::cout << std::endl;
}
int main()
{
std::cout.precision(20);
{
virtual_iterator<double,Sin> begin(0),end(5);
display(begin,end,"正弦函数:");
double result=std::accumulate(begin,end,0.0);
std::cout << "正弦函数求和 = [" << result<< "]" << std::endl;
}
std::cout << std::endl;
{
virtual_iterator<double,Cos> begin(0),end(5);
display(begin,end,"余弦函数:");
double result=std::accumulate(begin,end,0.0);
std::cout << "余弦函数求和 = [" << result<< "]" << std::endl;
}
std::cout << std::endl;
{
virtual_iterator<double,Sin> sin_begin(0),sin_end(5);
virtual_iterator<double,Cos> cos_begin(0),cos_end(5);
display(sin_begin,sin_end,"正弦函数a:");
display(cos_begin,cos_end,"余弦函数b:");
double result=std::inner_product(sin_begin,sin_end,cos_begin,0.0);
std::cout << "a和b的内积 = [" << result<< "]" << std::endl;
}
return 0;
}
自定义STL游标实现虚拟容器(2)
最新推荐文章于 2021-09-12 23:19:53 发布