Boost logo

Boost :

From: Marc Jacobs (marcja_at_[hidden])
Date: 2002-10-30 17:46:44


"Dirk Gerrits" <dirk_at_[hidden]> wrote in message
news:appjco$kql$1_at_main.gmane.org...
> Marc Jacobs wrote:
>
> > I'd like to offer two submissions to Boost.
> >
> > ----------------------------
> > The first is a straightforward implementation of a cartesian product
> > on two
> > ranges. That is, given iterators on two ranges, perform a binary
operation
> > on every combination of elements. Here is a pseudo-code example:
> >
> > r1 = { 'A', 'B', 'C' }
> > r2 = { 'D', 'E', 'F' }
> > // concat() is a binary functor that concatenates two characters into a
> > string
> > cartesian_product( r1.begin(), r1.end(), r2.begin(), r2.end(),
concat() )
> > // returns
> > // 'AD', 'AE', 'AF', 'BD', 'BE', 'BF', 'CD', 'CE', 'CF'
> >
> Wouldn't it be more STL like to take an output iterator parameter and
> return it after the function call? You know, like std::copy and such
> algorithms.

That's the way I implemented it. I just did a poor job of describing it sans
code in this thread. :)

Thanks for the input.
Marc

    /**
     * Performs a cartesian product, i.e. will perform __binary_op on every
combination of elements
     * between the first and second ranges.
     *
     * @param __first1 the beginning of the range for the left side
of the product
     * @param __last1 the end of the range for the left side of
the product
     * @param __first2 the beginning of the range for the right
side of the product
     * @param __last2 the end of the range for the left right of
the product
     * @param __binary_op the binary operation to perform for each
pairing of the cartesian
     * product
     * @return an output iterator compatible with the
result of __binary_op
     */
    template< class _InputIter1, class _InputIter2, class _OutputIter, class
_BinaryOperation >
    _OutputIter cartesian_product(
        _InputIter1 __first1,
        _InputIter1 __last1,
        _InputIter2 __first2,
        _InputIter2 __last2,
        _OutputIter __result,
        _BinaryOperation __binary_op
    )
    {
        for( ; __first1 != __last1; ++__first1 )
            for( _InputIter2 __pos2 = __first2; __pos2 != __last2; ++__pos2,
++__result )
                *__result = __binary_op( *__first1, *__pos2 );

        return __result;
    }


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk