#include <algorithm>
#include <iostream>
#include <vector>
#include <set>
#include <string>
 
struct Person {
	int age;
	std::string name;
};
 
class PersonProxy {
	public:
		PersonProxy(Person& p)
		: person(&p) {}
		PersonProxy(Person* p)
		: person(p) {}
 
		Person& operator*() { return *person; }
		Person* operator->() { return person; }
 
	private:
		Person* person;
};
 
int main()
{
	std::vector<Person> p1;
	p1.push_back(Person{42, "Bob"});
 
	Person bill{30, "Bill"};
	std::set<Person*> p2;
	p2.insert(&bill);
 
	std::vector<int> data;
 
	auto the_lambda = [](PersonProxy pp) {return pp->age;};
 
	std::transform(p1.begin(), p1.end(), std::back_inserter(data), the_lambda);
	std::transform(p2.begin(), p2.end(), std::back_inserter(data), the_lambda);
 
	for (int age : data)
	{
		std::cout << age << "\n";
	}
 
}
				I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8c3RyaW5nPgoKc3RydWN0IFBlcnNvbiB7CglpbnQgYWdlOwoJc3RkOjpzdHJpbmcgbmFtZTsKfTsKCmNsYXNzIFBlcnNvblByb3h5IHsKCXB1YmxpYzoKCQlQZXJzb25Qcm94eShQZXJzb24mIHApCgkJOiBwZXJzb24oJnApIHt9CgkJUGVyc29uUHJveHkoUGVyc29uKiBwKQoJCTogcGVyc29uKHApIHt9CgkJCgkJUGVyc29uJiBvcGVyYXRvciooKSB7IHJldHVybiAqcGVyc29uOyB9CgkJUGVyc29uKiBvcGVyYXRvci0+KCkgeyByZXR1cm4gcGVyc29uOyB9CgkJCglwcml2YXRlOgoJCVBlcnNvbiogcGVyc29uOwp9OwoKaW50IG1haW4oKQp7CglzdGQ6OnZlY3RvcjxQZXJzb24+IHAxOwoJcDEucHVzaF9iYWNrKFBlcnNvbns0MiwgIkJvYiJ9KTsKCQoJUGVyc29uIGJpbGx7MzAsICJCaWxsIn07CglzdGQ6OnNldDxQZXJzb24qPiBwMjsKCXAyLmluc2VydCgmYmlsbCk7CgkKCXN0ZDo6dmVjdG9yPGludD4gZGF0YTsKCQoJYXV0byB0aGVfbGFtYmRhID0gW10oUGVyc29uUHJveHkgcHApIHtyZXR1cm4gcHAtPmFnZTt9OwoJCglzdGQ6OnRyYW5zZm9ybShwMS5iZWdpbigpLCBwMS5lbmQoKSwgc3RkOjpiYWNrX2luc2VydGVyKGRhdGEpLCB0aGVfbGFtYmRhKTsKCXN0ZDo6dHJhbnNmb3JtKHAyLmJlZ2luKCksIHAyLmVuZCgpLCBzdGQ6OmJhY2tfaW5zZXJ0ZXIoZGF0YSksIHRoZV9sYW1iZGEpOwoJCglmb3IgKGludCBhZ2UgOiBkYXRhKQoJewoJCXN0ZDo6Y291dCA8PCBhZ2UgPDwgIlxuIjsKCX0KCQp9