2010-02-24 44 views
5

Tengo un std :: set con la clase Compare que requiere un parámetro adicional para comparar claves. Este parámetro variable se determina en tiempo de ejecución y lo empaqueta dentro de las teclas del conjunto solo para que sea accesible para Compare.pasando más datos a std: set Clase de comparación

Sin embargo, el parámetro lógicamente pertenece al conjunto en lugar de a las claves, por lo que esta solución parece incómoda y duplica el mismo valor en todas las claves.

¿Existe alguna forma elegante de pasar un parámetro adicional a la clase Compare? (Primero pensé en set :: value_comp, pero devuelve comparar objeto por valor mientras necesito una referencia).

Gracias.

Respuesta

0

La definición de std :: set es:

template < 
     class Key, 
     class Traits=less<Key>, 
     class Allocator=allocator<Key> 
> 
class set 

Así es Rasgos debe ser su operador de comparar, pero si se mira el constructor, se puede ver que hay de nuevo:

explicit set(
    const Traits& _Comp 
); 

Así que solo pase su instancia al constructor. (Tenga en cuenta que se realiza mediante copia)

+0

Esta respuesta es correcta, pero me pareció difícil de seguir. Para aclarar: necesita crear un objeto de comparación con los parámetros adicionales dentro, luego pasar ese objeto al constructor std :: set. No intente modificar los parámetros una vez que se haya construido el conjunto. –

+0

@Mark Ransom - no hay ninguna bala de plata, si se cambia la regla de clasificación, entonces todo el conjunto debe reconstruirse. Si los parámetros no afectan el orden de clasificación, puede pasarlo a Traits por referencia o puntero. – Dewfy

+0

No hay forma de reconstruir un conjunto, aparte de copiarlo en uno nuevo, así que estoy de acuerdo con mi afirmación. El objeto de comparación siempre debe devolver el mismo valor cuando se le da el mismo conjunto de entradas, de lo contrario, el conjunto puede funcionar mal. –

Cuestiones relacionadas