2012-08-23 41 views
8

Estoy usando sets. Yo uso una estructura personalizada como la clave. Estoy insertando un valor e intentando encontrar el valor insertado. Pero nunca parece encontrar el elemento.C++ std :: set Find function overloading == operator

He anulado tanto el operador == como el operador <.

Este es el código de la estructura:

struct distance_t 
{ 
public: 
int id; 
double distance; 

bool operator<(const distance_t& rhs) const 
{ 
    if(distance < rhs.distance) 
     return true; 
    else 
     return false; 
} 

bool operator==(const distance_t& rhs) 
{ 
    if(id == rhs.id) 
     return true; 
    else 
     return false; 
} 
}; 

Y este es el código de la principal

int main() 
{ 
    set<distance_t> currentSet; 

    distance_t insertDistance; 
    insertDistance.id =1; 
    insertDistance.distance = 0.5; 

    currentSet.insert(insertDistance); 

    distance_t findDistance; 
    findDistance.id = 1; 

    assert(currentSet.find(findDistance) != currentSet.end()); 
} 

Siempre falla en la sentencia assert. ¿Qué estoy haciendo mal?

Editar -Ok ahora entiendo que no usa el operador == en absoluto. Esto es lo que quiero. Necesito que la estructura de datos se ordene por distancia. Pero debería poder eliminarlo usando la identificación. ¿Hay alguna forma limpia o una estructura de datos ya existente para hacer esto?

+2

Sugerencia de estilo: donde tiene 'if (expr) return true; else return false; 'en su lugar, simplemente puede hacer' return expr; ' – Blastfurnace

+1

¿Qué pasa con solo' return id

+0

@Blastfurnace No necesita los paréntesis, tampoco. –

Respuesta

8

falla porque su menos-que utiliza la comparación distance_t::distance, que no está configurando en findDistance:

distance_t findDistance; 
findDistance.id = 1; 

std::set no utiliza operator== para cualquier cosa. Solo usa operator<. Entonces tendría que cambiar su lógica para usar distance_t::id.

Si desea buscar por id sin cambiar de pedido del conjunto, puede utilizar std::find:

set<distance_t>::iterator it = std::find(currentSet.begin(), 
             currentSet.end(), 
             findDistance); 

Esto utilizará su operator==. Tenga en cuenta que esto tiene una complejidad de tiempo lineal.

+0

Quiero usar la distancia para ordenar los elementos pero quiero que el ID encuentre el elemento. ¿Es eso posible? –

+1

@El pedido de FloydDutchman se usa para la búsqueda (el conjunto es un árbol binario). Por lo tanto, no es posible tener pedidos y búsquedas desacoplados. Podría incorporar 'id' en la lógica de ordenamiento, realmente depende de lo que está tratando de lograr. – juanchopanza

+1

@TheFlyingDutchman Puedes hacer que 'operator ' hvd

4

Porque operator== no se invoca en absoluto. La comparación de los elementos es como:

!(a < b) && !(b < a) 

En otras palabras, se utiliza operator<.

1

Como no ha asignado un valor a findDistance.distance, el resultado de la comparación menor no está definido.

Tenga en cuenta que sus definiciones de la igualdad y menos operadores de comparación son peligrosas, porque es fácil definir las instancias de distance_t donde el resultado es inconsistente. Un ejemplo son dos instancias con la misma distancia pero diferentes id.

Cuestiones relacionadas