#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() {
typedef std::vector<std::vector<std::string> > vec;
vec v { { "1", "2", "3" }, { "3", "2", "1" } };
for(int i = 0 ; i < 3 ; ++i) {
auto result = foo(v, [&i](vec::value_type const& lhs, vec::value_type const& rhs) -> bool {
return lhs[i] < rhs[i];
});
if(result.second)
std::cout << *std::begin(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+CnN0ZDo6cGFpcjx0eXBlbmFtZSBUOjp2YWx1ZV90eXBlLCBib29sPiBmb28oVCBjb25zdCYsIFUgY29uc3QmKTsKCmludCBtYWluKCkgewoJdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gPiB2ZWM7Cgl2ZWMgdiB7IHsgIjEiLCAiMiIsICIzIiB9LCB7ICIzIiwgIjIiLCAiMSIgfSB9OwoJZm9yKGludCBpID0gMCA7IGkgPCAzIDsgKytpKSB7CgkJYXV0byByZXN1bHQgPSBmb28odiwgWyZpXSh2ZWM6OnZhbHVlX3R5cGUgY29uc3QmIGxocywgdmVjOjp2YWx1ZV90eXBlIGNvbnN0JiByaHMpIC0+IGJvb2wgewoJCQkJcmV0dXJuIGxoc1tpXSA8IHJoc1tpXTsKCQl9KTsKCgkJaWYocmVzdWx0LnNlY29uZCkKCQkJc3RkOjpjb3V0IDw8ICpzdGQ6OmJlZ2luKHJlc3VsdC5maXJzdCk7Cgl9CgoJcmV0dXJuIDA7Cn0KCnRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CnN0ZDo6cGFpcjx0eXBlbmFtZSBUOjp2YWx1ZV90eXBlLCBib29sPiBmb28oVCBjb25zdCYgdiwgVSBjb25zdCYgZikKewoJc3RkOjpzZXQ8dHlwZW5hbWUgVDo6dmFsdWVfdHlwZSwgVT4gcyhmKTsKCWZvcihhdXRvIGNvbnN0JiBlIDogdikKCQlzLmluc2VydChlKTsKCglpZihzLnNpemUoKSkKCQlyZXR1cm4gc3RkOjptYWtlX3BhaXIoKnN0ZDo6YmVnaW4ocyksIHRydWUpOwoJZWxzZQoJCXJldHVybiBzdGQ6Om1ha2VfcGFpcih0eXBlbmFtZSBUOjp2YWx1ZV90eXBlKCksIGZhbHNlKTsKfQo=