Boost logo

Boost :

Subject: Re: [boost] [iterator] iterator_facade reference type problem
From: er (erwann.rogard_at_[hidden])
Date: 2010-01-14 10:24:46

>> But what do I do about the reference type? I can't use
>> std::pair<const KEY,VALUE>& because

Provided I understood correctly, would this be a possibility?

#include <boost/tuple/tuple.hpp>
#include <boost/iterator/zip_iterator.hpp>
#include <boost/iterator/transform_iterator.hpp>
#include <boost/ref.hpp>
#include <utility>

namespace boost{
namespace map2{

template<typename Key,typename Value>
struct zip_func

        typedef const boost::tuple<
             const Key&,
>& argument_type;
     typedef std::pair<Key,boost::reference_wrapper<Value> > result_type;

           result_type operator()(argument_type t) const
                return result_type(


template<typename ItK,typename ItV>
struct iterator{
        typedef boost::tuple<
> it_tuple_;

        typedef typename boost::zip_iterator<it_tuple_> zip_iter_;
     typedef typename boost::iterator_value<ItK>::type k_;
     typedef typename boost::iterator_value<ItV>::type v_;
     typedef zip_func<k_,v_> func_;
     typedef boost::transform_iterator<func_,zip_iter_> type;

        static type call(ItK it_k,ItV it_v){
             return type(zip_iter_(it_tuple_(it_k,it_v)),func_());


}// map2
}// boost


#include <vector>
#include <iostream>
#include <boost/assign/std/vector.hpp>
#include <map2_iterator.hpp>

int main (int argc, char * const argv[]) {

        typedef int key_;
     typedef int val_;
        typedef std::vector<key_> keys_;
     typedef std::vector<val_> vals_;

     using namespace boost::assign;

     keys_ keys; keys += 1,2,3;
     vals_ vals; vals += 1,2,3;

        typedef boost::range_iterator<keys_>::type it_k_;
        typedef boost::range_iterator<vals_>::type it_v_;

     typedef boost::map2::iterator<it_k_,it_v_> meta_map2_;
        typedef meta_map2_::type it_map_;

        it_map_ b_map = meta_map2_::call(boost::begin(keys),boost::begin(vals));
        it_map_ e_map = meta_map2_::call(boost::end(keys),boost::end(vals));

        int i = 1;
             BOOST_ASSERT(vals[i-1] == i);
                BOOST_ASSERT(vals[i-1] == i+1);

     return 0;

Boost list run by bdawes at, gregod at, cpdaniel at, john at