Here is a small change that boost zip_iterator
#include <iostream> #include <algorithm> #include <string> #include <map> #include <vector> #include <boost/iterator/zip_iterator.hpp> #include <boost/tuple/tuple.hpp> // this is our map type typedef std::map<int, std::string> map_t; // this functor will be called for each "pair" struct map_adder : public std::unary_function<const boost::tuple<const int&, const std::string&>&, void> { map_adder(map_t& my_map) : _my_map(my_map){} void operator()(const boost::tuple<const int&, const std::string&>& t) const { _my_map.insert(std::make_pair(t.get<0>(), t.get<1>())); } private: mutable map_t& _my_map; }; int main(void) { // test setup std::vector<int> keys; std::vector<std::string> values; keys.push_back(1); keys.push_back(2); keys.push_back(3); keys.push_back(4); values.push_back("1"); values.push_back("2"); values.push_back("3"); values.push_back("4"); std::vector<int>::const_iterator beg1 = keys.begin(); std::vector<int>::const_iterator end1 = keys.end(); std::vector<std::string>::const_iterator beg2 = values.begin(); std::vector<std::string>::const_iterator end2 = values.end(); // destination map_t my_map; // functor to actually add map_adder adder(my_map); // simply iterate over... std::for_each( boost::make_zip_iterator( boost::make_tuple(beg1, beg2) ), boost::make_zip_iterator( boost::make_tuple(end1, end2) ), adder ); std::cout << "size of map: " << my_map.size() << std::endl; return 0; }
Okay, here is a simpler version using std::transform , I don't know what already exists that can convert boost::tuple to std::pair , hence my simple function ...
#include <iostream> #include <algorithm> #include <string> #include <iterator> #include <map> #include <vector> #include <boost/iterator/zip_iterator.hpp> #include <boost/tuple/tuple.hpp> // this is our map type typedef std::map<int, std::string> map_t; map_t::value_type adapt_tuple(const boost::tuple<const map_t::key_type&, const map_t::mapped_type&>& t) { return map_t::value_type(t.get<0>(), t.get<1>()); } int main(void) { std::vector<int> keys; std::vector<std::string> values; keys.push_back(1); keys.push_back(2); keys.push_back(3); keys.push_back(4); values.push_back("1"); values.push_back("2"); values.push_back("3"); values.push_back("4"); std::vector<int>::const_iterator beg1 = keys.begin(); std::vector<int>::const_iterator end1 = keys.end(); std::vector<std::string>::const_iterator beg2 = values.begin(); std::vector<std::string>::const_iterator end2 = values.end(); map_t my_map; // simply iterate over... std::transform( boost::make_zip_iterator( boost::make_tuple(beg1, beg2) ), boost::make_zip_iterator( boost::make_tuple(end1, end2) ), std::inserter(my_map, my_map.end()), adapt_tuple ); std::cout << "size of map: " << my_map.size() << std::endl; return 0; }
source share