#include <iostream>
#include <cstddef>
#include <array>
#include <vector>
#include <algorithm>
using namespace std;
template <typename T> T max1(const T *arr, const std::size_t size)
{
T maxValue = arr[0];
for (size_t i = 1; i < size; ++i)
if (arr[i] > maxValue)
maxValue = arr[i];
return maxValue;
}
template <typename T> T max2(const T *first, const T *last)
{
T maxValue = *first;
++first;
for (; first != last; ++first)
if (*first > maxValue)
maxValue = *first;
return maxValue;
}
template <typename T, std::size_t size> T max3(const T (&arr)[size])
{
T maxValue = arr[0];
for (size_t i = 1; i < size; ++i)
if (arr[i] > maxValue)
maxValue = arr[i];
return maxValue;
}
template <typename T> T max4(T first, T last)
{
if (first == last)
return last;
T maxIt = first;
++first;
for (; first != last; ++first)
if (*first > *maxIt)
maxIt = first;
return maxIt;
}
int main()
{
{
const size_t SIZE = 5;
int arr1[SIZE] = {1, 2, 3, 4, 5};
cout << max1(arr1, SIZE) << endl;
}
{
const size_t SIZE = 5;
double arr2[SIZE] = {1, 2, 3, 4, 5};
cout << max2(arr2, arr2 + SIZE) << endl;
}
{
const size_t SIZE = 5;
double arr3[SIZE] = {1, 2, 3, 4, 5};
cout << max3(arr3) << endl;
}
{
array<int, 5> arr4 = {1, 2, 3, 4, 5};
cout << *max4(arr4.begin(), arr4.end()) << endl;
}
{
vector<double> arr5 = {1, 2, 3, 4, 5};
cout << *max_element(arr5.begin(), arr5.end()) << endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGRlZj4KI2luY2x1ZGUgPGFycmF5PgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IFQgbWF4MShjb25zdCBUICphcnIsIGNvbnN0IHN0ZDo6c2l6ZV90IHNpemUpCnsKICAgIFQgbWF4VmFsdWUgPSBhcnJbMF07CiAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IHNpemU7ICsraSkKICAgICAgICBpZiAoYXJyW2ldID4gbWF4VmFsdWUpCiAgICAgICAgICAgIG1heFZhbHVlID0gYXJyW2ldOwogICAgcmV0dXJuIG1heFZhbHVlOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gVCBtYXgyKGNvbnN0IFQgKmZpcnN0LCBjb25zdCBUICpsYXN0KQp7CiAgICBUIG1heFZhbHVlID0gKmZpcnN0OwogICAgKytmaXJzdDsKICAgIGZvciAoOyBmaXJzdCAhPSBsYXN0OyArK2ZpcnN0KQogICAgICAgIGlmICgqZmlyc3QgPiBtYXhWYWx1ZSkKICAgICAgICAgICAgbWF4VmFsdWUgPSAqZmlyc3Q7CiAgICByZXR1cm4gbWF4VmFsdWU7ICAgIAp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc3RkOjpzaXplX3Qgc2l6ZT4gVCBtYXgzKGNvbnN0IFQgKCZhcnIpW3NpemVdKQp7CiAgICBUIG1heFZhbHVlID0gYXJyWzBdOwogICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBzaXplOyArK2kpCiAgICAgICAgaWYgKGFycltpXSA+IG1heFZhbHVlKQogICAgICAgICAgICBtYXhWYWx1ZSA9IGFycltpXTsKICAgIHJldHVybiBtYXhWYWx1ZTsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IFQgbWF4NChUIGZpcnN0LCBUIGxhc3QpCnsKICAgIGlmIChmaXJzdCA9PSBsYXN0KQogICAgICAgIHJldHVybiBsYXN0OwoKICAgIFQgbWF4SXQgPSBmaXJzdDsKICAgICsrZmlyc3Q7CiAgICBmb3IgKDsgZmlyc3QgIT0gbGFzdDsgKytmaXJzdCkKICAgICAgICBpZiAoKmZpcnN0ID4gKm1heEl0KQogICAgICAgICAgICBtYXhJdCA9IGZpcnN0OwogICAgcmV0dXJuIG1heEl0Owp9CgppbnQgbWFpbigpIAp7Cgl7CgkJY29uc3Qgc2l6ZV90IFNJWkUgPSA1OwoJCWludCBhcnIxW1NJWkVdID0gezEsIDIsIDMsIDQsIDV9OwoJCWNvdXQgPDwgbWF4MShhcnIxLCBTSVpFKSA8PCBlbmRsOwoJfQoJCgl7CgkJY29uc3Qgc2l6ZV90IFNJWkUgPSA1OwoJCWRvdWJsZSBhcnIyW1NJWkVdID0gezEsIDIsIDMsIDQsIDV9OwoJCWNvdXQgPDwgbWF4MihhcnIyLCBhcnIyICsgU0laRSkgPDwgZW5kbDsKCX0KCQoJewoJCWNvbnN0IHNpemVfdCBTSVpFID0gNTsKCQlkb3VibGUgYXJyM1tTSVpFXSA9IHsxLCAyLCAzLCA0LCA1fTsKCQljb3V0IDw8IG1heDMoYXJyMykgPDwgZW5kbDsKCX0KCQoJewoJCWFycmF5PGludCwgNT4gYXJyNCA9IHsxLCAyLCAzLCA0LCA1fTsKCQljb3V0IDw8ICptYXg0KGFycjQuYmVnaW4oKSwgYXJyNC5lbmQoKSkgPDwgZW5kbDsKCX0KCQoJewoJCXZlY3Rvcjxkb3VibGU+IGFycjUgPSB7MSwgMiwgMywgNCwgNX07CgkJY291dCA8PCAqbWF4X2VsZW1lbnQoYXJyNS5iZWdpbigpLCBhcnI1LmVuZCgpKSA8PCBlbmRsOwoJfQoJCglyZXR1cm4gMDsKfQ==