#include <string>
#include <iostream>
#include <vector>
#include <map>
#include <unordered_map>
using namespace std;

template<template <typename...> class MAP, class KEY, class VALUE>
std::vector<KEY>
keys(const MAP<KEY, VALUE>& map)
{
	std::vector<KEY> result;
	result.reserve(map.size());
	for(const auto& it : map){
		result.emplace_back(it.first);
	}
	return result;
}

template<template <typename...> class MAP, class KEY, class VALUE>
std::vector<VALUE>
values(const MAP<KEY, VALUE>& map)
{
	std::vector<VALUE> result;
	result.reserve(map.size());
	for(const auto& it : map){
		result.emplace_back(it.second);
	}
	return result;
}

int main() {
	std::map<std::string, int> string_to_int;
	// std::unordered_map<std::string, int> string_to_int;
	string_to_int.emplace("foo", 12);
	string_to_int.emplace("bar", 34);
	
	cout << "Keys:" << endl;
	for(const auto& k : keys(string_to_int)){
		cout << k << endl;
	}
	
	cout << "Values:" << endl;
	for(const auto& v : values(string_to_int)){
		cout << v << endl;
	}
	
	return 0;
}