Re: BinaryPredicate Question
In article <Xns98C4680FC6F84obrickermydejanewsco@216.196.97.136>, Otis
Bricker <obricker@my-dejanews.com> wrote:
I'm trying to figure out is the following technique is valid.
Given
std::vector<DataItem> cache;
which is sorted by the ID_ field of each DataItem.
And this Predicate class:
class IdLessThan: public std::binary_function<long, DataItem, bool>
{
public:
bool operator()
( long lhs, const DataItem& rhs)const{return lhs <
rhs.ID_;};
};
Is the following valid?
Vector<DataItem>::iterator it =
std::upper_bound(cache.begin(),cache.end(),ID, IdLessThan());
I ask because the compiler I am using is unable to compile the debug
build of this. It seems to be trying to test the predicate by calling:
IdLessThan::operator()(const DataItem& lhs,long rhs);
Is this version required or is it just a case of a debug version
requiring it for 'testing', which I believe can be disabled?
And would it be a good idea to include the extra form to allow the
testing by the debug build?
Thanks.
since std::upper_bound requires a less than predicate [or operator < ()
for other version] it uses this predicate to effectively test equality
and greater than by using the less than predicate. x is equivalent to
y
as !pred(x,y)&& !pred(y,x) == true. x is greater than y as
pred(y,x) == true. Similiar expressions to test <= ,>= ,!= in terms of
<. You need both arguments, you don't need to inherit
from [directly or in effect] to use the predicate in algorithms in
<algorithm> so something like this:
struct lessThan
{
bool operator () (const DataItem &x,const Data &y) const
{
// normal less than even if it just forwards to
// DataItem::operator <
}
bool operator () (int x,const DataItem &y) const
{
// ...
}
bool operator () (const DataItem &x,int x) const
{
// ...
}
};
Or add a [preferably explicit to help prevent accidents] ctor to
DataItem to take an int arg. and construct as little as needed for
lessThan to work.
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]