Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > STL transform algorithm

Reply
Thread Tools

STL transform algorithm

 
 
Piotr
Guest
Posts: n/a
 
      02-14-2006

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_function<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>(_rectList.size()),
transform(_rectList.begin(), _rectList.end(), _y->begin(), GetY());

return *(_y);
}

 
Reply With Quote
 
 
 
 
roberts.noah@gmail.com
Guest
Posts: n/a
 
      02-14-2006

Piotr wrote:
> 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_function<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>(_rectList.size()),
> transform(_rectList.begin(), _rectList.end(), _y->begin(), GetY());


You try mem_fun?

transform(begin, end, mem_fun(&Rect::GetY));
>
> return *(_y);
> }


 
Reply With Quote
 
 
 
 
Piotr
Guest
Posts: n/a
 
      02-14-2006
Is there a way to replace these binary function as well? I use them in
STL sort algorithm:

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


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

 
Reply With Quote
 
roberts.noah@gmail.com
Guest
Posts: n/a
 
      02-14-2006

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


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.

 
Reply With Quote
 
Thomas Tutone
Guest
Posts: n/a
 
      02-14-2006
Piotr wrote:
> 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.


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

 
Reply With Quote
 
Daniel T.
Guest
Posts: n/a
 
      02-14-2006
In article <(E-Mail Removed). com>,
"Piotr" <(E-Mail Removed)> wrote:

> Is there a way to replace these binary function as well? I use them in
> STL sort algorithm:
>
> bool GreaterX:perator()( Rect* bd1, Rect* bd2)
> {
> return (bd1->getX() < bd2->getX());
> }
>
>
> bool SameX:perator()( Rect* bd1, Rect* bd2)
> {
> return (bd1->getX() == bd2->getX());
> }


(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*>::iterator 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.
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
transform algorithm and casting of functions suresh C++ 2 12-30-2007 09:07 AM
Transform algorithm 1-n, n-1 or m-n Diego Martins C++ 2 10-19-2006 01:07 PM
STL transform algorithm Patrick Guio C++ 9 11-02-2005 09:07 PM
blocking I/O with javax.xml.parsers.DocumentBuilder.parse() and javax.xml.transform.Transformer.transform() jazzdman@gmail.com Java 1 03-27-2005 06:56 AM
<algorithm> transform modification Steffen Brinkmann C++ 20 09-24-2003 11:30 AM



Advertisments