#include <iostream>
#include <boost/function_output_iterator.hpp>
#include <boost/variant.hpp>
#include <string>
#include <map>
#include <algorithm>
typedef std::map<int, std::string> FirstMap;
typedef std::map<short, double> SecondMap;
typedef boost::variant<FirstMap::mapped_type, SecondMap::mapped_type> Both;
typedef std::map<long, Both> BothMap;
struct CustomOutput {
CustomOutput(BothMap& ref) : _ref(ref) {}
template <typename Pair>
void operator()(const Pair& pair) const {
_ref.insert(BothMap::value_type { pair.first, pair.second });
}
private: BothMap& _ref;
};
struct CustomPred {
template <typename P1, typename P2>
bool operator()(const P1& p1, const P2& p2) const { return p1.first < p2.first; }
};
int main()
{
FirstMap first_map { { 1, "aap" }, { 3, "noot" }, { 5, "mies" } };
SecondMap second_map { { 1, 1/3. }, { 2, 2/3. }, { 4, 4/3.} };
BothMap both_map;
// iterate over maps union
std::set_union(
first_map.begin(), first_map.end(),
second_map.begin(), second_map.end(),
boost::make_function_output_iterator(CustomOutput(both_map)),
CustomPred()
);
for (auto& pair : both_map)
std::cout << pair.first << ":\t" << pair.second << "\n";
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb25fb3V0cHV0X2l0ZXJhdG9yLmhwcD4KI2luY2x1ZGUgPGJvb3N0L3ZhcmlhbnQuaHBwPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKdHlwZWRlZiBzdGQ6Om1hcDxpbnQsICAgc3RkOjpzdHJpbmc+IEZpcnN0TWFwOwp0eXBlZGVmIHN0ZDo6bWFwPHNob3J0LCBkb3VibGU+ICAgICAgU2Vjb25kTWFwOwoKdHlwZWRlZiBib29zdDo6dmFyaWFudDxGaXJzdE1hcDo6bWFwcGVkX3R5cGUsIFNlY29uZE1hcDo6bWFwcGVkX3R5cGU+IEJvdGg7CnR5cGVkZWYgc3RkOjptYXA8bG9uZywgIEJvdGg+ICAgICAgICBCb3RoTWFwOwoKc3RydWN0IEN1c3RvbU91dHB1dCB7CiAgICBDdXN0b21PdXRwdXQoQm90aE1hcCYgcmVmKSA6IF9yZWYocmVmKSB7fQoKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBQYWlyPgogICAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFBhaXImIHBhaXIpIGNvbnN0IHsgCiAgICAgICAgX3JlZi5pbnNlcnQoQm90aE1hcDo6dmFsdWVfdHlwZSB7IHBhaXIuZmlyc3QsIHBhaXIuc2Vjb25kIH0pOyAKICAgIH0KICAgIHByaXZhdGU6IEJvdGhNYXAmIF9yZWY7Cn07CgpzdHJ1Y3QgQ3VzdG9tUHJlZCB7CiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUDEsIHR5cGVuYW1lIFAyPgogICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFAxJiBwMSwgY29uc3QgUDImIHAyKSBjb25zdCB7IHJldHVybiBwMS5maXJzdCA8IHAyLmZpcnN0OyB9Cn07CgppbnQgbWFpbigpCnsKICAgIEZpcnN0TWFwICBmaXJzdF9tYXAgIHsgeyAxLCAiYWFwIiB9LCB7IDMsICJub290IiB9LCB7IDUsICJtaWVzIiB9ICB9OwogICAgU2Vjb25kTWFwIHNlY29uZF9tYXAgeyB7IDEsIDEvMy4gIH0sIHsgMiwgMi8zLiAgIH0sIHsgNCwgNC8zLn0gIH07CgogICAgQm90aE1hcCAgIGJvdGhfbWFwOwoKICAgIC8vIGl0ZXJhdGUgb3ZlciBtYXBzIHVuaW9uCiAgICBzdGQ6OnNldF91bmlvbigKICAgICAgICAgICAgZmlyc3RfbWFwLmJlZ2luKCksIGZpcnN0X21hcC5lbmQoKSwKICAgICAgICAgICAgc2Vjb25kX21hcC5iZWdpbigpLCBzZWNvbmRfbWFwLmVuZCgpLAogICAgICAgICAgICBib29zdDo6bWFrZV9mdW5jdGlvbl9vdXRwdXRfaXRlcmF0b3IoQ3VzdG9tT3V0cHV0KGJvdGhfbWFwKSksCiAgICAgICAgICAgIEN1c3RvbVByZWQoKQogICAgICAgICAgICApOwoKICAgIGZvciAoYXV0byYgcGFpciA6IGJvdGhfbWFwKQogICAgICAgIHN0ZDo6Y291dCA8PCBwYWlyLmZpcnN0IDw8ICI6XHQiIDw8IHBhaXIuc2Vjb25kIDw8ICJcbiI7Cn0K