2010-01-22 11 views
6

Estaba leyendo una publicación de StackOverFlow sobre la clasificación de un vector de pares por el segundo elemento del par. La respuesta más obvia fue crear un predicado, pero una respuesta que usaba impulso me llamó la atención.Ayuda para comprender los argumentos de boost :: bind placeholder

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

que he estado tratando de encontrar la manera boost :: bind obras, o al menos lo que usarlo, pero no puede averiguar cuál es el propósito de los argumentos de marcador de posición _1 y _2 son, y la documentación de impulso no se hunde en absoluto.

¿Alguien podría explicar este uso específico de boost :: bind?

P.S. Pregunta original: How do I sort a vector of pairs based on the second element of the pair?

Respuesta

7

Esta expresión:

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

a saber, el uso del operador < en realidad define un funtor entre otros dos funtores, los cuales definen por bind.

El funtor esperado por tipo debe tener un operator() que se parece a esto:

bool operator()(const T& arg1, const T& arg2); 

cuando estás creando un funtor usando < luego los titulares de nombres de impulsar _1 y _2 corresponden a arg1 y arg2 de la Functor que estás creando.

La llamada bind crear un funtor que llama ::second de arg1 y arg2

Con un poco de suerte, la introducción de lambdas en C++ 0x hará expresiones como esta obsoleto.

+0

Para el registro: 'typedef std :: pair pair_type; std :: sort (a.begin(), a.end(), [] (pair_type x, pair_type y) {return x.second GManNickG

5

std :: sort requiere un predicado binario para comparar dos elementos del rango. Los marcadores de posición muestran dónde se usarán el primer y el segundo argumento.

boost :: bind hace que toda la expresión se lea como _1.second < _2.second (excepto porque el operador. No se puede descargar, no se puede lograr tal expresividad).

Ambas llamadas de enlace, en este caso, crean un objeto de función que acepta un pair<int, int> y devuelve el valor de second. operator< a su vez está sobrecargado para devolver otro funtor binario que compara los resultados de los funtores anteriores. Y eso se usa por std::sort.

Cuestiones relacionadas