On Mon, Aug 23, 2010 at 04:49:58PM +0100, przemyslaw.sliwa@uk.bnpparibas.com wrote:
I have the following question. I have two containers
std::setstd::string insertedEvents; std::vectorstd::string eventNames;
How I would like to copy all those elements from eventNames which are not in insertedEvents. Can this can be done somehow using the boost::bind feature?
<algorithm> contains std::set_difference, which is most probably what you want, assuming that eventNames is sorted.
If it's not,
std::remove_copy_if(eventNames.begin(),eventNames.end(), std::back_inserter(out), boost::bind(&std::setstd::string::count, boost::cref(insertedEvents), _1) );
That is, bind the count member function of std::set to your set of events, and evaluate that for each element in your range.
Of course, something like Phoenix or Lambda would make the predicate easier on the eyes.
It's worth noting that if your compiler supports C++0x lambdas (gcc 4.5+ or VS2010), then the predicate becomes std::remove_copy_if(eventNames.begin(),eventNames.end(), std::back_inserter(out), [&insertedEvents](const std::string &s){ return insertedEvents.find(s) != insertedEvents.end(); }); and there is no need for Boost involvement at all.