Boost logo

Boost Users :

Subject: Re: [Boost-users] Using boost::bind with stl algorithms
From: OvermindDL1 (overminddl1_at_[hidden])
Date: 2010-08-23 20:00:38


On Mon, Aug 23, 2010 at 11:28 AM, <lfrfly_at_[hidden]> wrote:
>> On Mon, Aug 23, 2010 at 04:49:58PM +0100,
>
> przemyslaw.sliwa_at_[hidden]
>>
>> wrote:
>>>
>>> I have the following question. I have two containers
>>>
>>> std::set<std::string> insertedEvents;
>>> std::vector<std::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::set<std::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.

Or even shorter (using Boost.Phoenix as mentioned above):
  std::remove_copy_if(eventNames.begin(),eventNames.end(),
    std::back_inserter(out),
    find(ref(insertedEvents), val(s))!=end(ref(insertedEvents)) // for
speed, should probably cache this 'end' call externally...


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net