2010-06-02 12 views
13

¿Hay alguna forma de escribir una condición de una línea que devuelva verdadero si el contenedor STL está ordenado? El contenedor en cuestión es std :: vectoruna línea para comprobar si el contenedor STL está ordenado

tengo la intención de usarlo en una aserción

+3

No se debe poner este tipo de cosas en una aserción. Las afirmaciones son para cosas que NUNCA podrían suceder. Lanzar una excepción es muy probable que sea más apropiado. Si se aprueba un vector no clasificado viola un método u objeto de contrato de operación, entonces debe arrojar no afirmar. Las excepciones ofrecen grandes ventajas sobre las afirmaciones y deben usarse con preferencia en la mayoría de los casos. – radman

+1

@radman: Si nunca pudieran suceder, ¿por qué los afirmarías? ¡Necesitas definir el contexto! Por ejemplo: afirmar invariantes de clase, pero arrojar cuando se violan las condiciones previas de la interfaz o las postcondiciones. – ltjax

+0

@ltjax Tu derecho que era un poco escueto. Las afirmaciones son principalmente para atrapar errores del programador, las excepciones son por malas entradas o problemas de tiempo de ejecución inevitables. Creo que las invariantes de clase son un buen ejemplo de aserciones usadas correctamente. Fundamentalmente, las aserciones proporcionan una garantía para el código que las sigue, de modo que se minimiza el manejo invasivo de errores y los errores del programador se detectan temprano y en voz alta. – radman

Respuesta

23

Use adjacent_find en combinación con functor menor o mayor.

Restricción:
Debería saber si el contenedor debe ser ascendente o descendente.

Si el vector se supone que ser ordenados en orden ascendente:

//Checks the first element where adjacent value where elem > nextElem 
//returns end if the vector is sorted! 
//Complexity is O(n) 
vector<int>::iterator pos = std::adjacent_find (aVec.begin(), aVec.end(), // range 
            std::greater<int>());    


if (pos == aVec.end()) 
{ 
    std::cout<<" sorted"<<endl; 
} 
else 
{ 
    std::cout<<"Not sorted"<<endl; 
} 
+0

Batirme por un segundo. – GManNickG

+1

Truco bien conocido, aunque no tan obvio. Afortunadamente C++ 0x presenta la función 'is_sorted' para eso :) –

7

Puede utilizar std::is_sorted (vec.begin(), vec.end()) para determinar si se ordena. Sin embargo, tenga en cuenta que esto es O (n).

+6

'is_sorted' no forma parte de la biblioteca estándar de C++. –

+4

Está en el estándar C++ 0x - y se envía con VC++ 2010 – corvuscorax

+0

@corvuscorax, sí, está en C++ 0x, pero desafortunadamente solo es borrador. [No lo usaría en un código de producción.] (Http://stackoverflow.com/questions/1754397/how-are-you-using-c0x-today) –

0

Depende del tipo de datos STL que desee utilizar.

Un mapa ya está ordenado por la clave siempre que la clave tenga operadores de comparación sobrecargados. Eres bueno para ir aquí.

Una lista requiere que llame explícitamente a la función de ordenación. Deberá realizar un seguimiento de si lo ha ordenado o no.

Espero que esto ayude.

Cuestiones relacionadas