One issue is that std::end() and std::begin() as free functions didn't exist until C++11. But still, come C++11, they could have added a template overload that took in the container itself, so this isn't really an excuse.
But the thing is, the functions in <algorithm> are intended to make functionality like that reusable as much as possible, with little bloat. All the functionality that you need is already provided in the current max_element function template, so the standard library committee didn't feel the need to add more onto that.
There's more reasons listed in the link above, so as also being able to do reverse iteration on a container.