#include <iostream>
#include <map>

int main()
{
    // The value_type of a map is pair<const Key, T>.
    // To initialize a map an initializer list
    // of pair<Key, T> objects must be specified.

    // To initialize a pair:
    //
    std::pair<int, int> p{9, 10};
    std::cout << "pair:\n  (" << p.first << ", " << p.second << ")\n\n";

    // To initialize a simple map (no nesting)
    // with value_type of pair<int, int>:
    //
    std::map<int, int> simple_map
    {  // K  V
        { 5, 6 },
        { 7, 8 }
    };
    std::cout << "simple_map:\n";
    for (auto const& i: simple_map)
    {
        std::cout << "  (" << i.first << ", " << i.second << ")\n";
    }
    std::cout << "\n";

    // To initialize a complex map (with nesting)
    // with value_type of pair<const int, map<int, int>>
    //
    const std::map<int, std::map<int, int>> complex_map
    {  // K       V
       //       k  v
        { 1, { {3, 4},
               {5, 6} }
        },
        { 2, { {7, 8},
               {8, 8},
               {9, 0} }
        }
    };

    std::cout << "complex_map:\n";
    for (auto const& mi: complex_map)
    {
        std::cout << "  (" << mi.first << ", ";
        for (auto const& p: mi.second)
        {
            std::cout << '(' << p.first << ", " << p.second << ')';
        }
        std::cout << ")\n";
    }
}
