que tiene un std :: vector de esta estructura:C++ lambdas para std :: sort y std :: LOWER_BOUND/equal_range en un elemento de estructura en un vector ordenado de estructuras
struct MS
{
double aT;
double bT;
double cT;
};
el que quiero usar std :: sort on aswell como std :: lower_bound/equal_range etc ...
Necesito poder ordenarlo y buscarlo en cualquiera de los primeros dos elementos de la estructura. Así que por el momento tengo esto:
class MSaTLess
{
public:
bool operator() (const MS &lhs, const MS &rhs) const
{
return TLess(lhs.aT, rhs.aT);
}
bool operator() (const MS &lhs, const double d) const
{
return TLess(lhs.aT, d);
}
bool operator() (const double d, const MS &rhs) const
{
return TLess(d, rhs.aT);
}
private:
bool TLess(const double& d1, const double& d2) const
{
return d1 < d2;
}
};
class MSbTLess
{
public:
bool operator() (const MS &lhs, const MS &rhs) const
{
return TLess(lhs.bT, rhs.bT);
}
bool operator() (const MS &lhs, const double d) const
{
return TLess(lhs.bT, d);
}
bool operator() (const double d, const MS &rhs) const
{
return TLess(d, rhs.bT);
}
private:
bool TLess(const double& d1, const double& d2) const
{
return d1 < d2;
}
};
Esto permite que llame tanto std :: sort y std :: LOWER_BOUND con MSaTLess() para ordenar/búsqueda basada en el elemento de AT y con el MSbTLess() para ordenar/búsqueda basada en el elemento bT.
Me gustaría alejarme de los funtores y usar C++ 0x lambdas en su lugar. Para sort que es relativamente sencillo ya que la lambda tomará dos objetos de tipo MS como argumentos.
¿Qué pasa con el algoritmo low_bound y otros algoritmos de búsqueda binaria? Necesitan poder llamar a un comparador con argumentos (MS, dobles) y también al revés (doble, MS), ¿verdad? ¿Cómo puedo proporcionar estos con un lambda en una llamada a lower_bound? Sé que podría crear un objeto ficticio MS con el valor de clave requerido que se busca y luego usar el mismo lambda que con std :: sort, pero ¿hay alguna forma de hacerlo sin usar objetos ficticios?
Acabo de buscar en la implementación de MSVC y std :: binary_search llama a std :: lower_bound. El problema es que cada uno llama al predicado con los parámetros en diferente orden. Entonces, el primer ejemplo no parece funcionar. – Blastfurnace
@Blastfurnace: sí, no me sorprendería si no funciona, aunque creo que todo lo que has demostrado hasta ahora es que 'binary_search' requiere un comparador que funcione de" ambas maneras ", mientras que tal vez solo' low_bound' requiere que funcione de una manera. Si fuera 'low_bound' lo que se llama' binary_search', esto implicaría que 'low_bound' también necesita que funcione en ambos sentidos, pero con la dependencia en la otra dirección, al menos es plausible. –
Tiene razón. Por un capricho, revisé el MSVC std :: upper_bound y pasa los parámetros en el mismo orden que std :: binary_search. La lección que aprendí hoy es para evitar confundirme y asumir que mis predicados deben comparar dos objetos del tipo contenedor. – Blastfurnace