2009-08-27 27 views

Respuesta

75

¿Qué comparador estás utilizando?

Por defecto, ésta funcionará:

if(!myset.empty()) 
    *myset.rbegin(); 
else 
    //the set is empty 

Esto también habrá tiempo constante en lugar de lineal como la solución max_element.

+0

Encontrar el elemento máximo es el tiempo constante, sí, pero llenar el conjunto no es, ya que está ordenando en insertar. Un conjunto no ordenado tiene un inserto de tiempo constante, pero requeriría una búsqueda para el elemento máximo. – crunchdog

+1

Pero dado que la pregunta original comienza con "Tengo un std :: set", podemos suponer que se incurrirá en un tiempo de inserción no constante independientemente de nuestro mecanismo de búsqueda. Como ya pagó el precio, ¿por qué no aprovecharlo utilizando un método de búsqueda constante? – Darryl

+0

@crunchdog: 'unordered_set' solo tiene un promedio de tiempo constante, pero tiene el peor caso de tiempo lineal, que es peor que' set' – user102008

6

creo que busca std::max_element:

La función devuelve un iterador max_element() al elemento más grande de la gama [inicio, final).

+14

Este parece ser el camino lento para hacerlo, ya que max_element no puede saber que se ordena el rango. –

+2

Esto es lo que obtengo al responder una pregunta fuera de mi zona de confort :) No sabía que un 'std :: set' estaba ordenado por defecto. Como suponía que no estaba ordenado, un algoritmo O (n) parecía ser la única opción práctica. Ahora que sé lo que sé, sí, esta respuesta no es óptima. –

29

Los juegos se solicitan siempre. Suponiendo que está utilizando la comparación predeterminada (menos), simplemente tome el último elemento en el conjunto. rbegin() podría ser útil.

+0

Garantía de orden estándar de C++ : http://stackoverflow.com/q/8833938/895245 –

6

Dado que el conjunto ordena el elemento en orden ascendente de forma predeterminada, solo selecciona el último elemento del conjunto.

-1

Antes push() en su set<int> guardar el valor en int max en la variable global

+0

por favor explique qué se supone que debe hacer su respuesta, y quizás proporcione un ejemplo de código. Tengo curiosidad por ver lo que se te ocurre – andrewgu

Cuestiones relacionadas