Can UnaryOperator be a member function when std::transform is called

后端 未结 3 1045
终归单人心
终归单人心 2021-01-22 21:07

Based on std::transform

template < class InputIterator, class OutputIterator, class UnaryOperator >
  OutputIterator transform ( InputIterator first1, Inpu         


        
3条回答
  •  野性不改
    2021-01-22 21:52

    You need a helper object, like std::less but for a unary operator.

    C++11 lambdas make this incredibly easy:

    std::transform(xs.begin(), xs.end(), ys.begin(), [](the_type x){ return -x; });
    std::transform(xs.begin(), xs.end(), ys.begin(), [](the_type x){ return !x; });
    std::transform(xs.begin(), xs.end(), ys.begin(), [](the_type x){ return ~x; });
    

    Or, use these flexible helpers:

    struct negate
    {
        template
        auto operator()(const T& x) const -> decltype(-x) { return -x; }
    };
    
    struct invert
    {
        template
        auto operator()(const T& x) const -> decltype(!x) { return !x; }
    };
    
    struct complement
    {
        template
        auto operator()(const T& x) const -> decltype(~x) { return ~x; }
    };
    
    std::transform(xs.begin(), xs.end(), ys.begin(), negate());
    std::transform(xs.begin(), xs.end(), ys.begin(), invert());
    std::transform(xs.begin(), xs.end(), ys.begin(), complement());
    

提交回复
热议问题