首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

怎么用STL自带functor实现四则运算

2013-06-26 
如何用STL自带functor实现四则运算?想要写一个functor,实现return A + B * (*i)比如extern int A,Bvecto

如何用STL自带functor实现四则运算?
想要写一个functor,实现
  return A + B * (*i);

比如
extern int A,B;
vector<int> v;
...
transform(v.begin(), v.end(), ostream_iterator<int>(cout, " "), ????);
希望能针对每个数组的元素,输出 A+B*(*i);
STL functor?组合
[解决办法]

struct my_operation
{
    my_operation(int A, int B)
    : A(_A), B(_B)
    {}
    int operator()(int n)
    {
        return A + B * n;
    }
    int A, B;
}
transform(v.begin(), v.end(), ostream_iterator<int>(cout, " "), my_operation(A, B);

[解决办法]
引用:
自己写functor也是一种实现方式。我想学习一下stl自带的那些functor。
还有,我在VS2010中,不知道compose1这个函数在哪儿。
这个意思啊。。用compose1的话
compose1(bind1st(plus<int>(), A), bind1st(multiplies<int>(), B))
compose1是gnu的stl里独有的扩展,不属于标准,VS里用不了的
既然用vs2010,那就可以用lambda表达式了,又简短,又非常容易理解,跟上面那句完全不能比
[A,B](int n){return A + B * n;}
[解决办法]
引用:
自己写functor也是一种实现方式。我想学习一下stl自带的那些functor。
还有,我在VS2010中,不知道compose1这个函数在哪儿。

这个是扩展 
#define _HAS_TRADITIONAL_STL 1
之后就可以使用 compose1 了

建议学都不要学,直接用lambda表达式。简单方便容易看懂。使用compose1不容易看得懂
[解决办法]
自己构造compose1也可以, 不过不如lambda方便. 
一行代码搞定
template<class _Fn1, class _Fn2>
class unary_compose
: public unary_function<typename _Fn2::argument_type,
typename _Fn1::result_type>
{// functor adapter _Func(stored, right)
public:
typedef unary_function<typename _Fn2::argument_type,
typename _Fn1::result_type> _Base;
typedef typename _Base::argument_type argument_type;
typedef typename _Base::result_type result_type;

unary_compose(const _Fn1& _Func1,
const _Fn2& _Func2)
: op1(_Func1), op2(_Func2)
{// construct from functor and left operand
}

result_type operator()(const argument_type& _Value) const
{// apply functor to operands
return (op1(op2(_Value)));
}

result_type operator()(argument_type& _Value) const
{// apply functor to operands
return (op1(op2(_Value)));
}

protected:
_Fn1 op1;// the functor to apply
_Fn2 op2;// the functor to apply


};

template<class _Fn1,
class _Fn2> inline
unary_compose<_Fn1, _Fn2> compose1(const _Fn1& _Func1, const _Fn2& _Func2)
{// return a unary_compose functor adapter
return (unary_compose<_Fn1, _Fn2>(_Func1, _Func2));
}

using namespace std;
void test()
{
vector<int> v(10);
int i = 1;
for (auto& x : v)
x = i++;
int A = 1, B = 2;
// A+B*(*i)
transform(v.begin(), v.end(), ostream_iterator<int>(cout, " "), compose1(bind1st(plus<int>(), A), bind1st(multiplies<int>(), B)));
cout << endl;
transform(v.begin(), v.end(), ostream_iterator<int>(cout, " "), [&](int x){ return A+B*x;});
}

热点排行