STL transform algorithm

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Piotr

    #1

    STL transform algorithm


    Hi,

    I have the following code which uses STL transform algorithm. It
    basically takes a list of Rect* object, get all the y attribute and
    store it in a vector of 'int'.

    My question is: is there a way to simplify the code? Is there a way for
    me to get rid of the GetY class, since it essentially just calls
    'getY()'. Thank you.

    class GetY : public std::unary_func tion<Rect*, int>
    {
    public:
    int operator()(Rect * r);
    };

    int GetY :: operator()( Rect* r)
    {
    return r->getY();
    }


    vector<int>& getY(list<Rect* > _rectList) {

    vector<int>* _y = new vector<int>(_re ctList.size()),
    transform(_rect List.begin(), _rectList.end() , _y->begin(), GetY());

    return *(_y);
    }

  • roberts.noah@gmail.com

    #2
    Re: STL transform algorithm


    Piotr wrote:[color=blue]
    > Hi,
    >
    > I have the following code which uses STL transform algorithm. It
    > basically takes a list of Rect* object, get all the y attribute and
    > store it in a vector of 'int'.
    >
    > My question is: is there a way to simplify the code? Is there a way for
    > me to get rid of the GetY class, since it essentially just calls
    > 'getY()'. Thank you.
    >
    > class GetY : public std::unary_func tion<Rect*, int>
    > {
    > public:
    > int operator()(Rect * r);
    > };
    >
    > int GetY :: operator()( Rect* r)
    > {
    > return r->getY();
    > }
    >
    >
    > vector<int>& getY(list<Rect* > _rectList) {
    >
    > vector<int>* _y = new vector<int>(_re ctList.size()),
    > transform(_rect List.begin(), _rectList.end() , _y->begin(), GetY());[/color]

    You try mem_fun?

    transform(begin , end, mem_fun(&Rect:: GetY));[color=blue]
    >
    > return *(_y);
    > }[/color]

    Comment

    • Piotr

      #3
      Re: STL transform algorithm

      Is there a way to replace these binary function as well? I use them in
      STL sort algorithm:

      bool GreaterX::opera tor()( Rect* bd1, Rect* bd2)
      {
      return (bd1->getX() < bd2->getX());
      }


      bool SameX::operator ()( Rect* bd1, Rect* bd2)
      {
      return (bd1->getX() == bd2->getX());
      }

      Comment

      • roberts.noah@gmail.com

        #4
        Re: STL transform algorithm


        Piotr wrote:[color=blue]
        > Is there a way to replace these binary function as well? I use them in
        > STL sort algorithm:
        >
        > bool GreaterX::opera tor()( Rect* bd1, Rect* bd2)
        > {
        > return (bd1->getX() < bd2->getX());
        > }
        >
        >
        > bool SameX::operator ()( Rect* bd1, Rect* bd2)
        > {
        > return (bd1->getX() == bd2->getX());
        > }[/color]

        There is all sorts of useful goodies in <algorithm>. Have a look there
        and/or get Josuttis's book on the std lib.

        I don't know, I would have to look it up.

        Comment

        • Thomas Tutone

          #5
          Re: STL transform algorithm

          Piotr wrote:[color=blue]
          > Hi,
          >
          > I have the following code which uses STL transform algorithm. It
          > basically takes a list of Rect* object, get all the y attribute and
          > store it in a vector of 'int'.
          >
          > My question is: is there a way to simplify the code? Is there a way for
          > me to get rid of the GetY class, since it essentially just calls
          > 'getY()'. Thank you.[/color]

          Yes. Take a look at std::mem_fun(), which permits you to eliminate the
          GetY functor entirely. Here's a reference:

          http://www.sgi.com/tech/stl/mem_fun_t.html

          Best regards,

          Tom

          Comment

          • Daniel T.

            #6
            Re: STL transform algorithm

            In article <1139933387.815 273.67080@g43g2 000cwa.googlegr oups.com>,
            "Piotr" <rasputin.piotr @gmail.com> wrote:
            [color=blue]
            > Is there a way to replace these binary function as well? I use them in
            > STL sort algorithm:
            >
            > bool GreaterX::opera tor()( Rect* bd1, Rect* bd2)
            > {
            > return (bd1->getX() < bd2->getX());
            > }
            >
            >
            > bool SameX::operator ()( Rect* bd1, Rect* bd2)
            > {
            > return (bd1->getX() == bd2->getX());
            > }[/color]

            (I'm assuming getX returns an int.)

            In both cases, the functions take two Rect*s, call "->getX()" on each
            and performs a compare on the results returning a bool. The only
            difference is what is being used to make the comparison.

            It just so happens that there are two functors in the standard library
            that already do the two different comparisons (std::less and
            std::equal_to) so we simply need to create one class that can use either
            of those functors. It's operator() will look something like this:

            bool operator()( const Rect* bd1, const Rect* bd2 ) const {
            return fn( bd1->getX(), bd2->getX() );
            }

            If 'fn' is std::less, then it will return true if bd1's x is less than
            bd2's x. If 'fn' is std::equal_to, then the two xs must be equal for it
            to return true.

            Here is the whole class.

            template <typename Op>
            class compare_x_t: public binary_function <Rect*, Rect*, bool>
            {
            Op fn;
            public:
            compare_x_t() { }
            compare_x_t( Op f ): fn( f ) { }
            bool operator()( const Rect* bd1, const Rect* bd2 ) const {
            return fn( bd1->getX(), bd2->getX() );
            }
            };

            and a helper function for creating the right class object.

            template <typename Op>
            compare_x_t<Op> compare_x( Op f ) {
            return compare_x_t<Op> ( f );
            }


            Now you can:

            void fn( list<Rect*>& ll, Rect* refRect ) {
            ll.sort( compare_x( less<int>() ) );

            list<Rect*>::it erator it = find_if( ll.begin(), ll.end(),
            bind2nd( compare_x( equal_to<int>() ), refRect ) );
            }

            The above could be made more generic but don't do it unless you need it.

            --
            Magic depends on tradition and belief. It does not welcome observation,
            nor does it profit by experiment. On the other hand, science is based
            on experience; it is open to correction by observation and experiment.

            Comment

            Working...