2010-02-24 13 views
5

mi hanno uno std :: set con la classe Confronta che richiede ulteriore parametro per confrontare le chiavi. Questo parametro variabile è determinato in fase di esecuzione e lo impacchetta all'interno delle chiavi del set solo per renderlo accessibile a Compare.che passano più dati per STD: impostare classe Confronto

Tuttavia, il parametro appartiene logicamente al set anziché le chiavi in ​​modo tale soluzione appare scomoda e duplica lo stesso valore in tutte le chiavi.

C'è un modo elegante per passare parametro aggiuntivo alla classe Confronta? (Ho inizialmente pensato a set :: value_comp, ma restituisce il confronto oggetto per valore mentre ho bisogno di un riferimento).

Grazie.

risposta

0

La definizione di std :: set è:

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

Così Tratti è dovrebbe essere l'operatore di confronto, ma se guarderebbe costruttore, si può vedere ancora lì:

explicit set(
    const Traits& _Comp 
); 

Quindi, passa la tua istanza al costruttore. (Nota è fatto copiando)

+0

Questa risposta è corretta, ma ho trovato difficile da seguire. Per chiarire: è necessario creare un oggetto di confronto con i parametri aggiuntivi all'interno, quindi passare quell'oggetto al costruttore std :: set. Non provare a modificare i parametri dopo la creazione del set. –

+0

@ Mark Ransom - c'è nos pallottola d'argento, se regola di ordinamento è cambiato, quindi intero set deve essere ricostruito. Se i parametri non influenzano l'ordinamento, puoi passarlo ai Tratti per riferimento o puntatore. – Dewfy

+0

Non c'è modo di ricostruire un set, se non di copiarlo su uno nuovo, quindi sono pronto ad accettare la mia dichiarazione. L'oggetto di confronto deve sempre restituire lo stesso valore quando viene fornito lo stesso insieme di input, altrimenti l'insieme potrebbe non funzionare correttamente. –

Problemi correlati