Boost logo

Boost Users :

From: David Abrahams (dave_at_[hidden])
Date: 2007-06-10 14:45:18


on Sun Jun 10 2007, Andrej van der Zee <mavdzee-AT-yahoo.co.uk> wrote:

> Hi,
>
> Sorry if this already has been posted, but I have a
> problem with compile-time performance when trying to
> get the intersection of two type sequences. For
> example, when I do something like this:
>
> template<typename list1, typename list2>
> struct intersect
> {
> typedef typename boost::mpl::remove_if<list1,
> mpl::not_< mpl::contains<list2, mpl::_1>
> >::type type;
> };
>
> typedef mpl::vector<a,b,...,z> l1;
> typedef mpl::vector<c,e,t,u,v> l2;
>
> typename intersect<list1,list2>::type my_intersection;
>
> Then for large type sequences compile-time becomes
> unacceptable (O(M*N)).

I'm surprised it's even that good, since most compilers have such poor
performance for multiple instantiations of the same template. That's
the cost you'd expect for a direct runtime translation of your
algorithm.

> Is there a better way to do this?

I'd use an associative sequence like mpl::set.

-- 
Dave Abrahams
Boost Consulting
http://www.boost-consulting.com

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