Connecting Tech Pros Worldwide Forums | Help | Site Map

using count and count_if on class objects

JohanS
Guest
 
Posts: n/a
#1: Jul 22 '05
Hi

count(v.begin(), v.end(), 5) is easy for a vector of int's.

But how do i make it work with a class object? I have tried a few ways
but can't get it to work since i don't really understand how this
stuff works yet.

If i have class A with 2 int members that you get with A.x() and A.y()
and i want to use count or count_if if A.y() == value.

I have found out how to call member functions with for_each(v.begin(),
v.end(), mem_fun_ref(&A::y)). But this still doesn't solve my problem.

Help please

Daniel T.
Guest
 
Posts: n/a
#2: Jul 22 '05

re: using count and count_if on class objects


multimarine69@hotmail.com (JohanS) wrote:
[color=blue]
> count(v.begin(), v.end(), 5) is easy for a vector of int's.
>
> But how do i make it work with a class object? I have tried a few ways
> but can't get it to work since i don't really understand how this
> stuff works yet.
>
> If i have class A with 2 int members that you get with A.x() and A.y()
> and i want to use count or count_if if A.y() == value.
>
> I have found out how to call member functions with for_each(v.begin(),
> v.end(), mem_fun_ref(&A::y)). But this still doesn't solve my problem.
>
> Help please[/color]

If you want to count how many objects have y() == 5 then you can do
something like this:

count_if( v.begin(), v.end(),
compose1( bind2nd( equal_to<int>(), 5 ), mem_fun_ref( &A::y ) ) );

Where compose1 (which is a part of the STL but didn't make it into
standard C++) is implemented like this:

template < typename Op1, typename Op2>
class unary_compose : public std::unary_function<
typename Op2::argument_type, typename Op1::result_type >
{
Op1 fn1;
Op2 fn2;
public:
unary_compose( const Op1& x, const Op2& y ) : fn1( x ), fn2( y ) { }
typename Op1::result_type operator( )(
const typename Op2::argument_type& x ) const
{
return fn1( fn2( x ) );
}
};

template < typename Op1, typename Op2 >
inline unary_compose< Op1, Op2 > compose1( const Op1& fn1,
const Op2& fn2 )
{
return unary_compose< Op1, Op2 >( fn1, fn2 );
}
Closed Thread


Similar C / C++ bytes