J'ai un ensemble de pointeurs que je voudrais parcourir de manière déterministe. Évidemment, si j'utilise l'ordre de tri par défaut pour set, cela sera basé sur les adresses mémoire des pointeurs qui peuvent être différentes chaque fois que le programme s'exécute. Donc, je définis un comparateur personnalisé que je veux utiliser, mais je ne veux pas changer le type de modèle de l'ensemble (parce qu'il est utilisé dans un million de places dans le code), donc je veux passer dans un objet de comparaison à la constructeur établi qui est dérivé de std :: moinsComparateur personnalisé via un constructeur explicite pour trier std :: set
class TestClass
{
public:
TestClass(int id_) : id(id_) {}
~TestClass() {}
int getId() const { return id;}
void setId(int id_) { id = id_; }
private:
int id;
};
struct TestClassLessThan : public std::less<TestClass*>
{ // functor for operator<
bool operator()(const TestClass* &_Left, const TestClass* &_Right) const
{ // apply operator< to operands
return (_Left->getId() < _Right->getId());
}
};
int main(void)
{
TestClassLessThan comp;
set<TestClass*> testSet(comp), testSet2(comp);
TestClass* obj1 = new TestClass(1);
TestClass* obj2 = new TestClass(2);
testSet.insert(obj1);
testSet.insert(obj2);
TestClass* obj = *(testSet.begin());
cout << "First run" << endl;
BOOST_FOREACH(TestClass* o, testSet) // expecting 1,2 - get 1,2
cout << o->getId() << endl;
// now change the ordering (based on id) and insert into a new set in the same order
obj1->setId(3);
testSet2.insert(obj1);
testSet2.insert(obj2);
cout << "Second run" << endl;
BOOST_FOREACH(TestClass* o, testSet2) // expecting 2,3 - get 3,2
cout << o->getId() << endl;
delete obj1;
delete obj2;
}
donc ma question est, qu'ai-je oublié de le faire?
c'est parfait ...mais vous dites que si je déclare définir dans une classe mais il est ensuite passé à un autre qui n'inclut pas la coutume moins - cette deuxième classe peut avoir un comportement différent/indéfini? Je pense que je vais m'assurer que la définition de l'ensemble et ses méthodes d'accesseur incluent toutes les personnalisations moins spécialisées. –