#include <iostream>
#include <functional>
#include <vector>
#include <set>
#include <string>
template<typename T, typename U>
std::pair<typename T::value_type, bool> foo(T const&, U const&);
int main() {
std::vector<std::string> v { "hello", "world", "czesiek" };
auto result = foo(v, [](std::string const& lhs, std::string const& rhs) -> bool {
return lhs < rhs;
});
if(result.second)
std::cout << result.first;
return 0;
}
template<typename T, typename U>
std::pair<typename T::value_type, bool> foo(T const& v, U const& f)
{
std::set<typename T::value_type, U> s(f);
for(auto const& e : v)
s.insert(e);
if(s.size())
return std::make_pair(*std::begin(s), true);
else
return std::make_pair(typename T::value_type(), false);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHNldD4KI2luY2x1ZGUgPHN0cmluZz4KCnRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CnN0ZDo6cGFpcjx0eXBlbmFtZSBUOjp2YWx1ZV90eXBlLCBib29sPiBmb28oVCBjb25zdCYsIFUgY29uc3QmKTsKCmludCBtYWluKCkgewoJc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHYgeyAiaGVsbG8iLCAid29ybGQiLCAiY3plc2llayIgfTsKCWF1dG8gcmVzdWx0ID0gZm9vKHYsIFtdKHN0ZDo6c3RyaW5nIGNvbnN0JiBsaHMsIHN0ZDo6c3RyaW5nIGNvbnN0JiByaHMpIC0+IGJvb2wgewoJCXJldHVybiBsaHMgPCByaHM7Cgl9KTsKCglpZihyZXN1bHQuc2Vjb25kKQoJCXN0ZDo6Y291dCA8PCByZXN1bHQuZmlyc3Q7CgoJcmV0dXJuIDA7Cn0KCnRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CnN0ZDo6cGFpcjx0eXBlbmFtZSBUOjp2YWx1ZV90eXBlLCBib29sPiBmb28oVCBjb25zdCYgdiwgVSBjb25zdCYgZikKewoJc3RkOjpzZXQ8dHlwZW5hbWUgVDo6dmFsdWVfdHlwZSwgVT4gcyhmKTsKCWZvcihhdXRvIGNvbnN0JiBlIDogdikKCQlzLmluc2VydChlKTsKCglpZihzLnNpemUoKSkKCQlyZXR1cm4gc3RkOjptYWtlX3BhaXIoKnN0ZDo6YmVnaW4ocyksIHRydWUpOwoJZWxzZQoJCXJldHVybiBzdGQ6Om1ha2VfcGFpcih0eXBlbmFtZSBUOjp2YWx1ZV90eXBlKCksIGZhbHNlKTsKfQo=