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.
fonte
2013-04-28 09:29:54
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
@ user999007: prego, buona fortuna per il tuo progetto;) –