#include <iostream>
#include <vector>
#include <set>
#include <functional>
#include <iostream>
#include <algorithm>
#include <iterator>

using namespace std;

template <template<class...> class Collection, typename Lambda, typename Type, typename ...CollectionArgs>
auto map(const Collection<Type, CollectionArgs...> &source, Lambda&& lambda)
	-> Collection< decltype( lambda(*source.begin()) ) >
{
	Collection< decltype( lambda(*source.begin()) ) > result;
	std::transform(source.begin(), source.end(), std::inserter(result, result.end()), lambda);
	return result;
}

int main() {
	
	std::vector<int> ints = {1,2,3,4,5};
	std::set<int> int_set = {7,8,9};
	std::vector<float> floats = map( ints, []( int v) -> float { return v;} );
	std::set<float> floats2 = map( int_set, []( int v) -> float { return v;} );
	for( auto & n: floats)
	{
		std::cout << n << std::endl;
	}
	
	std::cout << "---" << std::endl;
	for( auto & n: floats2)
	{
		std::cout << n << std::endl;
	}
	
	return 0;
}