#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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8aXRlcmF0b3I+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGUgPHRlbXBsYXRlPGNsYXNzLi4uPiBjbGFzcyBDb2xsZWN0aW9uLCB0eXBlbmFtZSBMYW1iZGEsIHR5cGVuYW1lIFR5cGUsIHR5cGVuYW1lIC4uLkNvbGxlY3Rpb25BcmdzPgphdXRvIG1hcChjb25zdCBDb2xsZWN0aW9uPFR5cGUsIENvbGxlY3Rpb25BcmdzLi4uPiAmc291cmNlLCBMYW1iZGEmJiBsYW1iZGEpCgktPiBDb2xsZWN0aW9uPCBkZWNsdHlwZSggbGFtYmRhKCpzb3VyY2UuYmVnaW4oKSkgKSA+CnsKCUNvbGxlY3Rpb248IGRlY2x0eXBlKCBsYW1iZGEoKnNvdXJjZS5iZWdpbigpKSApID4gcmVzdWx0OwoJc3RkOjp0cmFuc2Zvcm0oc291cmNlLmJlZ2luKCksIHNvdXJjZS5lbmQoKSwgc3RkOjppbnNlcnRlcihyZXN1bHQsIHJlc3VsdC5lbmQoKSksIGxhbWJkYSk7CglyZXR1cm4gcmVzdWx0Owp9CgppbnQgbWFpbigpIHsKCQoJc3RkOjp2ZWN0b3I8aW50PiBpbnRzID0gezEsMiwzLDQsNX07CglzdGQ6OnNldDxpbnQ+IGludF9zZXQgPSB7Nyw4LDl9OwoJc3RkOjp2ZWN0b3I8ZmxvYXQ+IGZsb2F0cyA9IG1hcCggaW50cywgW10oIGludCB2KSAtPiBmbG9hdCB7IHJldHVybiB2O30gKTsKCXN0ZDo6c2V0PGZsb2F0PiBmbG9hdHMyID0gbWFwKCBpbnRfc2V0LCBbXSggaW50IHYpIC0+IGZsb2F0IHsgcmV0dXJuIHY7fSApOwoJZm9yKCBhdXRvICYgbjogZmxvYXRzKQoJewoJCXN0ZDo6Y291dCA8PCBuIDw8IHN0ZDo6ZW5kbDsKCX0KCQoJc3RkOjpjb3V0IDw8ICItLS0iIDw8IHN0ZDo6ZW5kbDsKCWZvciggYXV0byAmIG46IGZsb2F0czIpCgl7CgkJc3RkOjpjb3V0IDw8IG4gPDwgc3RkOjplbmRsOwoJfQoJCglyZXR1cm4gMDsKfQ==