#include <iostream>
#include <vector>
template<typename TIterator, bool (*Predicate)(const TIterator &, const TIterator &)>
TIterator findPosition(TIterator begin, TIterator end)
{
TIterator result(begin);
for (TIterator it = begin + 1; it != end; ++it)
{
if (Predicate(it, result))
result = it;
}
return result;
}
typedef std::vector<int> vec;
bool lesser(const vec::iterator &a, const vec::iterator &b)
{
return (*a) < (*b);
}
bool greater(const vec::iterator &a, const vec::iterator &b)
{
return (*a) > (*b);
}
bool weird(const vec::iterator &a, const vec::iterator &b)
{
return ((*a) | (*b)) & 0x4;
}
int main(int argc, char **argv)
{
vec v;
v.push_back(10000);
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
v.push_back(50);
v.push_back(1);
vec::iterator min = findPosition<typename vec::iterator, lesser>(v.begin(), v.end());
vec::iterator max = findPosition<typename vec::iterator, greater>(v.begin(), v.end());
vec::iterator weird = findPosition<typename vec::iterator, greater>(v.begin(), v.end());
std::cout << "min: " << *min << "\tmax: " << *max << "\tweird: " << *weird << '\t';
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdGVtcGxhdGU8dHlwZW5hbWUgVEl0ZXJhdG9yLCBib29sICgqUHJlZGljYXRlKShjb25zdCBUSXRlcmF0b3IgJiwgY29uc3QgVEl0ZXJhdG9yICYpPgpUSXRlcmF0b3IgZmluZFBvc2l0aW9uKFRJdGVyYXRvciBiZWdpbiwgVEl0ZXJhdG9yIGVuZCkKewogICAgVEl0ZXJhdG9yIHJlc3VsdChiZWdpbik7CiAgICBmb3IgKFRJdGVyYXRvciBpdCA9IGJlZ2luICsgMTsgaXQgIT0gZW5kOyArK2l0KQogICAgewogICAgICAgIGlmIChQcmVkaWNhdGUoaXQsIHJlc3VsdCkpCiAgICAgICAgICAgIHJlc3VsdCA9IGl0OwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKfQoKdHlwZWRlZiBzdGQ6OnZlY3RvcjxpbnQ+IHZlYzsKCmJvb2wgbGVzc2VyKGNvbnN0IHZlYzo6aXRlcmF0b3IgJmEsIGNvbnN0IHZlYzo6aXRlcmF0b3IgJmIpCnsKICAgIHJldHVybiAoKmEpIDwgKCpiKTsKfQoKYm9vbCBncmVhdGVyKGNvbnN0IHZlYzo6aXRlcmF0b3IgJmEsIGNvbnN0IHZlYzo6aXRlcmF0b3IgJmIpCnsKICAgIHJldHVybiAoKmEpID4gKCpiKTsKfQoKYm9vbCB3ZWlyZChjb25zdCB2ZWM6Oml0ZXJhdG9yICZhLCBjb25zdCB2ZWM6Oml0ZXJhdG9yICZiKQp7CiAgICByZXR1cm4gKCgqYSkgfCAoKmIpKSAmIDB4NDsKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7CiAgICB2ZWMgdjsKICAgIHYucHVzaF9iYWNrKDEwMDAwKTsKICAgIHYucHVzaF9iYWNrKDEwKTsKICAgIHYucHVzaF9iYWNrKDIwKTsKICAgIHYucHVzaF9iYWNrKDMwKTsKICAgIHYucHVzaF9iYWNrKDQwKTsKICAgIHYucHVzaF9iYWNrKDUwKTsKICAgIHYucHVzaF9iYWNrKDEpOwoKICAgIHZlYzo6aXRlcmF0b3IgbWluID0gZmluZFBvc2l0aW9uPHR5cGVuYW1lIHZlYzo6aXRlcmF0b3IsIGxlc3Nlcj4odi5iZWdpbigpLCB2LmVuZCgpKTsKICAgIHZlYzo6aXRlcmF0b3IgbWF4ID0gZmluZFBvc2l0aW9uPHR5cGVuYW1lIHZlYzo6aXRlcmF0b3IsIGdyZWF0ZXI+KHYuYmVnaW4oKSwgdi5lbmQoKSk7CiAgICB2ZWM6Oml0ZXJhdG9yIHdlaXJkID0gZmluZFBvc2l0aW9uPHR5cGVuYW1lIHZlYzo6aXRlcmF0b3IsIGdyZWF0ZXI+KHYuYmVnaW4oKSwgdi5lbmQoKSk7CgogICAgc3RkOjpjb3V0IDw8ICJtaW46ICIgPDwgKm1pbiA8PCAiXHRtYXg6ICIgPDwgKm1heCA8PCAiXHR3ZWlyZDogIiA8PCAqd2VpcmQgPDwgJ1x0JzsKCiAgICByZXR1cm4gMDsKfQ==