2010-11-15 13 views
15

Por favor, echar un vistazo a este ejemplo publicado por Johannes Schaub para ordenar un vector de pares:Ayúdame a entender este uso de impulso :: unirse

How do I sort a vector of pairs based on the second element of the pair?

std::sort(a.begin(), a.end(), 
      boost::bind(&std::pair<int, int>::second, _1) < 
      boost::bind(&std::pair<int, int>::second, _2)); 

pensé que entiendo impulso: : ata, pero tengo problemas con este.

Pregunta 1:

algoritmo de la clase está a la espera de una función de predicado como un tercer parámetro. Lo que veo aquí, es una expresión booleana. ¿Qué me falta ?:

boost::bind(&std::pair<int, int>::second, _1) < boost::bind(&std::pair<int, int>::second, _2) 

¿El impulso :: unen operador de sobrecarga biblioteca < para esos dos se une, y está volviendo una especie de puntero de función (como un lambda)?

Pregunta 2:
Esto me se confunde:

boost::bind(&std::pair<int, int>::second, _1) 

lo general, hay una especie de puntero de función como el primer parámetro de una llamada bind, pero aquí se trata de una dirección de un miembro de la clase? ¿Cuál es el resultado de ese enlace particular?

Gracias por su tiempo & ayuda

Respuesta

14

boost :: bind sobrecarga el operador! y los operadores lógicos y relacionales ==,! =, <, < =,>,> =, & &, ||, así que esta es la razón por la que "ves" una expresión booleana, pero en realidad estás obteniendo un predicado de función .

Desde allí puede ver que está vinculando al segundo miembro del par para el 1er y 2º argumento de la función sobrecargada menor que.

En cuanto a su segunda pregunta: Boost se unen reconocerá cuando haya pasado un puntero a un miembro y tratarlo como si se llama a

bind<R>(mem_fun(&std::pair<int,int>::second), args); 

Es así como la documentación describe esto:

Usando

se unen con los punteros a los miembros

Los punteros a funciones miembro y punteros a miembros de datos no sonObjetos de función, porque no lo hacen operador de soporte(). Para mayor comodidad, el enlace acepta punteros de miembro como su primer argumento , y el comportamiento es como si boost :: mem_fn se ha utilizado para convertir el puntero de miembro en un objeto de función .En otras palabras, el bind expresión

(& X :: f, args)

es equivalente a

bind (mem_fn (& X :: f), args)

donde R es el tipo de retorno de X :: f (para funciones miembro) o el tipo de el miembro (para miembros de datos.)

Puede encontrar esto y más información here.

Cuestiones relacionadas