Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > is there any transform_if algorithm?

Reply
Thread Tools

is there any transform_if algorithm?

 
 
baibaichen
Guest
Posts: n/a
 
      12-15-2005
hi, i need to implement several functions which are similar with
transform, but just oprerate on the elements that match some condition,
i have wirtten one by myself:

template<class In,class Out,class Pred class Op>
Out transform_if(In first,In last,Out res,Pred p,Op op)
{
while(first!=last){
if (p(*first))
*res = op(*first);
++first;++res;
}
return res;
}

but it is something subtle:

1). if the prediction return false? does output iterator increase?
2). how about exception safe?
3). efficiency problem, if we can predict the input will match the
codition, then we have gotten the information that functor will do.

my question is there any better way?

 
Reply With Quote
 
 
 
 
Cy Edmunds
Guest
Posts: n/a
 
      12-15-2005
"baibaichen" <(E-Mail Removed)> wrote in message
news:(E-Mail Removed) ups.com...
> hi, i need to implement several functions which are similar with
> transform, but just oprerate on the elements that match some condition,
> i have wirtten one by myself:
>
> template<class In,class Out,class Pred class Op>
> Out transform_if(In first,In last,Out res,Pred p,Op op)
> {
> while(first!=last){
> if (p(*first))
> *res = op(*first);
> ++first;++res;
> }
> return res;
> }
>
> but it is something subtle:
>
> 1). if the prediction return false? does output iterator increase?
> 2). how about exception safe?
> 3). efficiency problem, if we can predict the input will match the
> codition, then we have gotten the information that functor will do.
>
> my question is there any better way?
>


I'm not sure what your function could do that can't be done with
std::transform. Consider:

class func
{
public:
int operator () (int xj, int yj) const
{
if (xj == 2)
return yj; // don't change the output value
else
return 2 * xj; // change the output value
}
};

std::transform(x, x+3, y, y, func());

does the same thing as:

class pred
{
public:
bool operator () (int xj) const {return xj != 2;}
};

class op
{
public:
int operator () (int xj) const {return 2 * xj;}
};

template<class In,class Out,class Pred, class Op>
Out transform_if(In first,In last,Out res,Pred p,Op op)
{
while(first!=last){
if (p(*first))
*res = op(*first);
++first;++res;
}
return res;
}

transform_if(x, x+3, y, pred(), op());

The trick is to send the output stream to the functor along with the input
stream.

--
Cy
http://home.rochester.rr.com/cyhome/


 
Reply With Quote
 
 
 
 
baibaichen
Guest
Posts: n/a
 
      12-15-2005
no, it is TOTALly different when the Out template parameter is just
output iterator,i.e. the insert_iterator and ostream_iterator, their
oprerator++ do nothing!!

here is "it is something subtle" in my previous post,i.e. if the
prediction return false, does i need increase outpout iterator? it is
diffcult to answser, consider:
1. if the output equal input, i.e. i write back to input iterator, i
need increase
2. if output is a real iterator, such as a vector.begin() and that
vector has enough space, i can not increase.
3. if the ouput is something like insert_iterator or ostream_iterator,
i do not care..

the better way what i can image is the input template parameter is
something like filter iterator, so we do not need tramsform_if, but i
can not find any useful inforamtion about it.

 
Reply With Quote
 
Augusto KhaoticMind da Silva
Guest
Posts: n/a
 
      12-15-2005

baibaichen wrote:
> hi, i need to implement several functions which are similar with
> transform, but just oprerate on the elements that match some condition,
> i have wirtten one by myself:
>
> template<class In,class Out,class Pred class Op>
> Out transform_if(In first,In last,Out res,Pred p,Op op)
> {
> while(first!=last){
> if (p(*first))
> *res = op(*first);
> ++first;++res;
> }
> return res;
> }
>
> but it is something subtle:
>
> 1). if the prediction return false? does output iterator increase?
> 2). how about exception safe?
> 3). efficiency problem, if we can predict the input will match the
> codition, then we have gotten the information that functor will do.
>
> my question is there any better way?


Dunno if this will help you, but you can implement the transform_if in
terms of remove_copy_if and for_each (or transform).
Maybe this is the reason why there is no transform_if.

--
KM

 
Reply With Quote
 
baibaichen
Guest
Posts: n/a
 
      12-15-2005
really? could u write more details?

thanks

 
Reply With Quote
 
Michiel.Salters@tomtom.com
Guest
Posts: n/a
 
      12-15-2005

baibaichen wrote:
> hi, i need to implement several functions which are similar with
> transform, but just oprerate on the elements that match some condition,


Check the VTL. It's a view library, and one of the components offers
a filtered view over a collection. If you use that view as an input to
transform,
you're done. Another solution is to use an iterator wrapper around your
output iterator that applies the transformation. Do both, and you can
even
use std::copy()

HTH,
Michiel Salters

 
Reply With Quote
 
Neil Cerutti
Guest
Posts: n/a
 
      12-15-2005
On 2005-12-15, baibaichen <(E-Mail Removed)> wrote:
> no, it is TOTALly different when the Out template parameter is
> just output iterator,i.e. the insert_iterator and
> ostream_iterator, their oprerator++ do nothing!!


That need not concern you. Algorithm transform will do the right
thing. As long as the algorithm you're using accepts the type of
iterator you pass in, all will be well.

--
Neil Cerutti
 
Reply With Quote
 
Augusto KhaoticMind da Silva
Guest
Posts: n/a
 
      12-15-2005

baibaichen wrote:
> really? could u write more details?
>
> thanks


Supposing "p" is the predicate you want the elements to fulfill and
"op" the operation you want to apply, you can write something like:


remove_copy_if(iter1.begin(), iter1.end(), iter2.begin(), not1(op));
transform(iter2.begin(), iter2.end(), iter2.begin(), p);


The remove_copy_if will remove all elements from iter1 that do not
match your predicate and copy them to iter2 (i.e., it will copy all
elements that DO match your predicate).
After that just execute transform on iter2 copying it to itself (hence
why i said it maybe might be better to use for_each).


--
KM

 
Reply With Quote
 
baibaichen
Guest
Posts: n/a
 
      12-16-2005
i have tested VTL before, but unfortunately , i can not compile it.

 
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
501 PIX "deny any any" "allow any any" Any Anybody? Networking Student Cisco 4 11-16-2006 10:40 PM
Are there any Belkin router users out there? OM UK VOIP 12 10-04-2005 08:32 AM
I am getting loads of spam by e-mail.Most of it is not even addressed to me so god knows how I am receiving it. Any ideas . Is there a spam guard available on blueyonder? How do I get it on my system if there is?Cheers GW Geoff/Elaine Computer Support 11 11-16-2004 11:17 PM
Re: Are there any decent indoor light (low light) digital cameras out there? ishtarbgl Digital Photography 0 04-01-2004 07:10 PM
Are there any free .pdf writers out there Goonigoogoo Computer Support 5 11-22-2003 03:27 AM



Advertisments