2011-10-14 12 views
30

Traté de usar la función lambda con sort, pero estaba obteniendo errores de "Fallo de segmentación". Me las arreglé para simplificar el código por lo siguiente:¿Debería std :: sort funcionar con la función lambda en C++ 0x/C++ 11?

#include <iostream> 
#include <algorithm> 

int main() 
{ 
    const int len = 18; 
    int intArr[len]; 
    for (int i=0;i<len;i++) intArr[i]=1000+i; 
    // The following is expected to sort all but the last element of the array 
    std::sort(intArr, intArr + len -1, [](int a, int b) 
    { 
     std::cout<<"("<<a<<", "<<b<<")\n"; 
     return (a<b?-1:(a>b?1:0)); 
    }); 
    return 0; 
} 

puedo compilar y ejecutar el código en Ubuntu 11.04 (x64) usando

g++ -std=gnu++0x test2.cpp && ./a.out.

Imprime una gran cantidad de pares de la forma (large_integer, 1008), un par de (0, 1008) y sale con "Segmentation fault".

+4

Solo como observación, solo está ordenando los primeros 17 elementos con su código. –

+5

Sí. Este hecho se observa en el único comentario del código. – fiktor

+0

@KerrekSB: "// Se espera que lo siguiente clasifique todo menos el último elemento de la matriz" – Griwes

Respuesta

33

El predicado de comparación debe devolver un bool: verdadero si es < by de lo contrario. Cambie la instrucción de retorno a:

return a < b; 

No se debe confundir con funciones de comparación de 3 vías C-estilo.

+0

Gracias. De hecho, estaba equivocado. Con a fiktor

+1

La razón por la cual segfaults con el predicado incorrecto sigue siendo un misterio para mí. –

+1

@NilsPipenbrinck: 'std :: sort' tiene un comportamiento indefinido si el comparador no impone un orden débil estricto. No es tan inesperado que pueda producirse un segfault. – Mankarse

16

Se supone que el predicado implementa un orden simple y débil. También su rango está desactivado si desea ordenar todo. (I perdidas que eso era intencional.) Así que en general estamos buscando algo como esto:

std::sort(intArr, intArr + nelems, [](int a, int b){ return a < b; }); 

O incluso:

std::sort(intArr, intArr + nelems); 

El predicado por defecto para la clasificación es std::less<T>, lo que hace exactamente lo que hace la lambda

6

El predicado por std::sort no tomar el -1,0,1 similar a Java, pero en cambio, quiere que regrese un valor lógico que responde a la pregunta 'es el primer argumento menor que el segundo argumento?', Que se utiliza para ordenar la débilmente elementos. Como -1 es un valor distinto de cero, el algoritmo de clasificación lo considera verdadero y causa que el algoritmo tenga un desglose.

+1

"// Se espera que lo siguiente clasifique todo menos el último elemento de la matriz" – Griwes

+0

@Griwes Huh? ¿Cómo está relacionado esto con la respuesta? –

+0

@Christian: tuve una edición anterior que se perdió el comentario en su código. Lo eliminé de mi respuesta. Griwes aparentemente lo atrapó antes que yo. –

Cuestiones relacionadas