读书人

修正下小弟我自个模仿的STL

发布时间: 2012-04-06 12:22:24 作者: rapoo

修正下我自个模仿的STL

C/C++ code
#include <iostream>#include <string>#include <vector>#include   <algorithm > using namespace std;template<class _Arg1,class _Result>struct unary_function{    typedef _Arg1 argument_type;    typedef _Result result_type;};template <class _Arg1, class _Arg2, class _Result>struct binary_function {    typedef _Arg1 first_argument_type;    typedef _Arg2 second_argument_type;    typedef _Result result_type;};template<class _Tp>struct plus:public binary_function<_Tp,_Tp,_Tp>{    _Tp operator() ( const _Tp &_x,const _Tp& _y) const     {        cout<<"_x="<<_x<<","<<"_y"<<_y<<endl;        return _x+_y;    }};template <class _Tp>struct binder2nd :public unary_function<_Tp::first_argument_type,_Tp::result_type>{    _Tp op;    _Tp::second_argument_type value;    binder2nd(const _Tp& _X,const _Tp::second_argument_type& _Y):op(_X),value(_Y){};    result_type operator()(const argument_type& _X) const    {        return op(_X,value);    }};int main(){    int ia[5]={0,1,2,3,4};    vector<int> m_vector;    m_vector.insert(m_vector.begin(),ia,ia+5);    copy(m_vector.begin(),m_vector.end(),ostream_iterator<int>(cout," "));    for_each(m_vector.begin(),m_vector.end(),binder2nd<plus<int> >(plus<int>(),4));    copy(m_vector.begin(),m_vector.end(),ostream_iterator<int>(cout," "));}

凭着看了STLPort的代码的记忆,自个写了几个类,本想vector的每个值都加个4,现在是加不了了。
能不能修改代码,使得能把binder2nd<plus<int> >(plus<int>(),4))改成binder2nd>(plus<int>(),4))

[解决办法]
有请扛太阳的大侠吧~~~

[解决办法]
现在真是越来越荒唐了。VS2005.NET居然无法通过编译,而在GCC4.2.1版本中也出现一些莫名奇妙的错误。而在VisualDSP++4.5环境中确OK。
现在做PC开发的C++编译器都不如做嵌入式开发的C++编译器,真是太丢人了。

楼主是不是想把binder2nd的模板参数< plus<int> >去掉?

[解决办法]
C/C++ code
struct binder2nd     :public unary_function<typename _Tp::first_argument_type,typename _Tp::result_type>
[解决办法]
用transform可以加4
C/C++ code
transform(m_vector.begin(), m_vector.end(), m_vector.begin(), binder2nd<plus<int>>(plus<int>(),4));
[解决办法]
楼主是想将结果值加4?

C/C++ code
 
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

template <typename _Arg1,typename _Result>
class unary_function{
public:
typedef _Arg1 argument_type;
typedef _Result result_type;
};

template <typename _Arg1, typename _Arg2, typename _Result>
class binary_function {
public:
typedef _Arg1 first_argument_type;
typedef _Arg2 second_argument_type;
typedef _Result result_type;
};

template <typename _Tp>
class plus : public binary_function <_Tp,_Tp,_Tp>
{
public:
_Tp operator() ( _Tp &_x,const _Tp& _y) const
{
cout < <"_x=" < <_x < <"," < <"_y=" < <_y < <endl;
return _x += _y;
}
};


template <typename _Tp>


class binder2nd : public unary_function <_Tp::first_argument_type,_Tp::result_type>
{
public:
_Tp op;
_Tp::second_argument_type value;
binder2nd(_Tp& _X, _Tp::second_argument_type& _Y):op(_X),value(_Y){};
result_type operator()(argument_type& _X) const
{
return op(_X,value);
}
};


int main(void)
{
int ia[5]={0,1,2,3,4};
int dest[5];
int addition = 4;
vector <int> m_vector;
m_vector.insert(m_vector.begin(),ia,ia+5);
copy(m_vector.begin(),m_vector.end(),dest);
plus <int> p;
binder2nd < plus <int> > b(p,addition);
for_each(m_vector.begin(),m_vector.end(), b);
copy(m_vector.begin(),m_vector.end(), dest);

return 0;
}



[解决办法]
不能把binder2nd <plus <int> > (plus <int> (),4))改成binder2nd> (plus <int> (),4))
但能像STL那样写一个


C/C++ code
template <class _Fn2, class _Ty>inline binder2nd<_Fn2> bind2nd( const _Fn2& _Func, const _Ty& _Right ){    typename _Fn2::second_argument_type _Val( _Right );    return ( binder2nd<_Fn2>( _Func, _Val ) );} 

读书人网 >C++

热点推荐