Алгоритмы STL не знают, из какого контейнера вы взяли итераторы, упорядочен ли он и какие ограничения порядка использовались. Это линейный алгоритм, который проверяет все элементы в диапазоне, отслеживая максимальное значение, видимое до сих пор.
Обратите внимание, что даже если вы можете использовать методы метапрограммирования для определения типа контейнера, в котором итераторы получены из этого, не гарантируется, что вы можете просто перейти к последнему элементу, чтобы получить максимум:
int values[] = { 1, 2, 3, 4, 5 };
std::set<int, greater<int> > the_set( values, values+5 );
std::max_element( the_set.begin(), the_set.end() ); //??
Даже если итераторы взяты из набора, это не последний, а первый элемент, который содержит максимум. С более сложными типами данных набор можно упорядочить с помощью другого ключа, который может не иметь отношения к минимальным / максимальным значениям.