c++ stl iterator max stl-algorithm

find min value in vector c++



¿Por qué std:: max_element requiere un ForwardIterator? (1)

El algoritmo max_element la biblioteca estándar de C ++ requiere que los iteradores se pasen como entradas al modelo ForwardIterator .

Tengo entendido que ForwardIterator refina InputIterator al especificar que puede usar un ForwardIterator para iterar varias veces sobre el mismo rango. Por lo tanto, los algoritmos de paso múltiple requieren ForwardIterator s.

Sin embargo, max_element no es un algoritmo de múltiples pasadas: basta con recorrer un rango una vez para determinar su elemento máximo. Entonces, ¿por qué max_element necesita las capacidades adicionales de ForwardIterator ?


std::max_element devuelve un iterador al elemento máximo. Si proporciona un rango de paso único, ese iterador ya no será válido, ya que el algoritmo debe realizar un pase completo en el rango.

En un rango de paso único, no puede mantener un iterador utilizable en un valor anterior. Esto se debe a una condición posterior en ++r dada en la Tabla 107 en el estándar:

publicación: ya no se requiere que ninguna copia del valor anterior de r sea ​​desreferenciable ni esté en el dominio de == .

Básicamente, un rango de paso único es un rango que "desaparece" a medida que lo atraviesa, y std::max_element necesita un rango que se std::max_element para devolver un iterador (posiblemente) a la mitad.

Se podría escribir un algoritmo para calcular el máximo que devuelve el valor máximo real en lugar de un iterador, pero eso requeriría que los valores se puedan copiar para devolverlo por valor. Movable no sería suficiente ya que el movimiento evitaría el uso de const iterators. Y regresar por referencia tampoco sería una opción, ya que eso significaría que el rango realmente se quedó.