2011-05-12 13 views
5

¿Cómo reescribiría el código siguiente, por ejemplo, utilizando un algoritmo STL sin bucle?Ejemplo de bucle utilizando punteros reescritos utilizando un algoritmo STL, sin un bucle?

vector<double> pizzaBox; 
int biggestSlice = 0; 
for (int* p = &pizzaBox[0]; p != pizzaBox[pizzaBox.size()]; p++) { 
    if(*p > biggestSlice) 
     biggestSlice = *p; 
} 
+0

Este algoritmo particular, o cualquier bucle en general? –

+1

Debe recorrer el vector, y no la matriz subyacente: 'para (vector :: iterador p = pizzaBox.begin(); p = pizzaBox.end(); ++ p!)'. Eso funcionará para cualquier tipo de contenedor (list, map, hash_map), no solo vector. Lo que se hace es garantizar que funcione (porque se requiere vector para almacenar los elementos en un bloque continuo de memoria), pero formalmente indefinido. –

+1

Nota: 'pizzaBox [pizzaBox.size()]' es en realidad un comportamiento indefinido. Estás accediendo a un elemento más allá del final de la matriz. Si usa 'pizzaBox.at (pizzaBox.size())' lanzará una excepción. –

Respuesta

14

Suponiendo que en realidad quería decir vector<int>, y después de la corrección de su condición de fin de bucle, se puede utilizar el algoritmo de max_element aquí:

int biggestSlice = *max_element(pizzaBox.begin(), pizzaBox.end()); 

(Nótese que max_element devuelve un iterador, por lo tanto, I' m desreferenciación del valor de retorno antes de asignar a biggestSlice.)

Esto, por supuesto, ya no funciona (= produce un comportamiento indefinido nuestro) cuando el vector está vacío. Debe probar esto explícitamente antes de desreferenciando el valor de retorno de la función.

+5

'if (! PizzaBox.empty())', pero el código del que pregunta tiene el mismo problema. –

+0

@Steve Comentario válido. –

+2

@Steve Jessop: La pregunta OP tiene ese problema incluso con un vector no vacío. –

Cuestiones relacionadas