2013-04-28 3 views
5

Questo definizioni sono all'interno di OuterClass:C++ STL set: Confronta oggetto con lo stato estrinseca

struct Compare 
{ 
    bool operator()(const T&, const T&); 
}; 
typedef set<T, Compare> MySet; 

mio problema è che la funzione di confronto operator() dipende dallo stato di OuterClass. (MySet istanze vengono utilizzati nel corso di un algoritmo per l'ottimizzazione e devono ordinare in modo diverso nelle diverse fasi.)

Esiste un modo/soluzione per accedere ai membri non statici di OuterClass dall'interno della funzione di confronto operator()?

risposta

5

C'è qualche modo/soluzione alternativa per accedere ai membri non statici di OuterClass dall'operatore della funzione di confronto()?

C'è. Basta scrivere un costruttore definito dall'utente per Compare che accetta e memorizza un riferimento a OuterClass, in questo modo:

struct Compare 
{ 
    Compare(OuterClass& o) : oc(o) { } 
    bool operator()(const T&, const T&) 
    { 
     // Uses oc somehow... 
    } 
private: 
    OuterClass& oc; 
}; 

Poi, quando si crea il set, si può fare qualcosa di simile:

int main() 
{ 
    typedef std::set<T, Compare> MySet; 

    OuterClass oc; // <== Construct an object of type Outerclass somehow... 

    MySet ms(Compare(oc)); // <== Construct your comparator and pass it 
          //  in input to the constructor of std::set 
} 

Attenzione tuttavia: il criterio di ordinazione dovrebbe rimanere stabile. Gli elementi devono sempre confrontare lo stesso per lo stesso set. Per il paragrafo 23.2.4/3 del C++ 11 standard:

La frase “equivalenza delle chiavi” si intende la relazione di equivalenza imposto dal confronto e non il operator== sui tasti. Cioè, due chiavi k1 e k2 sono considerate equivalenti se per il confronto oggetto comp, comp(k1, k2) == false && comp(k2, k1) == false. Per qualsiasi due tasti k1 e k2 nello stesso contenitore , chiamare comp(k1, k2) deve sempre restituire lo stesso valore.

+0

Ah, ho dimenticato di guardare i costruttori dell'insieme, quindi non ho riconosciuto che posso creare l'oggetto di confronto da solo. Grazie per il suggerimento sullo standard C++ 11 - tengo a mente :) Grazie mille! – schoettl

+0

@ user999007: prego, buona fortuna per il tuo progetto;) –