#include <algorithm>
#include <memory>
#include <vector>
#include <iostream>

struct Boo {
	int val;
	explicit Boo(const int val) : val(val) {}
};


int main() {
	std::vector<std::shared_ptr<Boo>> vec;
	vec.push_back(std::make_shared<Boo>(1));
	vec.push_back(std::make_shared<Boo>(2));
	vec.push_back(std::make_shared<Boo>(3));
	auto min1 = std::min_element(vec.begin(), vec.end(), [](auto& x, auto& y) { return x->val < y->val; });
	auto min2 = *std::min_element(vec.begin(), vec.end(), [](auto& x, auto& y) { return x->val < y->val; });
	std::cout << typeid(min1).name() << "\n" << typeid(min2).name();
	return 0;
}