Copy elements from one STL container to another STL container

M

Marko.Cain.23

How can I copy elements from one STL container to another STL container
if a condition is met and if it find an element fails that condition,
it stops the copying?

I can't use the original copy<> algorithm since it does not take a
binary operation.
And I don't think I can use transform either since it does not stop if
the binary operation return false.

Please correct me if I am wrong or any ideas to my problem.
 
J

Jerry Coffin

How can I copy elements from one STL container to another STL container
if a condition is met and if it find an element fails that condition,
it stops the copying?

I can't use the original copy<> algorithm since it does not take a
binary operation.
And I don't think I can use transform either since it does not stop if
the binary operation return false.

You should be able to do that (somewhat inefficiently) with
remove_copy_if. Your predicate would be something like this:

// warning: untested code.
struct predicate {
bool failed;

predicate() : failed(false) {}
bool operator()(X const &x) {
return failed |= !your_real_condition(x);
}
};

I'm not sure whether this is really a good idea though. What you want
doesn't really fit what remove_copy_if is intended to do, so it's
probably better to create a new algorithm that more accurately reflects
what you want.
 
D

Daniel T.

How can I copy elements from one STL container to another STL container
if a condition is met and if it find an element fails that condition,
it stops the copying?

I can't use the original copy<> algorithm since it does not take a
binary operation.
And I don't think I can use transform either since it does not stop if
the binary operation return false.

Please correct me if I am wrong or any ideas to my problem.

copy( in.begin(), find_if( in.begin(), in.end(), pred ), out.begin() );

The above will scan the container 'in' and find the first element that
satisfies 'pred', then the copy algorithm will copy from the beginning
of 'in' to the iterator that was found, into 'out'.

This is a two pass process, if that is unacceptable, you will need to
make a new algorithm:

template < typename In, typename Out, typename Pred >
Out copy_unitl( In first, In last, Out first2, Pred fn ) {
while ( first != last && !fn( *first ) )
*first2++ = *first++;
return first2;
}
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,731
Messages
2,569,432
Members
44,832
Latest member
GlennSmall

Latest Threads

Top