確定的な方法で反復処理したいポインタセットがあります。明らかに、setのデフォルトの並べ替え順序を使用すると、これはプログラムが実行されるたびに異なるポインタのメモリアドレスに基づいて行われます。だから私は使用したいカスタムコンパレータを定義しますが、テンプレートの型を変更する必要はありません(コードの100万個の場所で使用されているためです)。コンパレータオブジェクトを渡す必要があります。 std :: lessから派生したコンストラクタを設定します。並べ替えのための明示的なコンストラクタによるカスタムコンパレータ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;
}
私の質問は何ですか?
これは完璧です...しかし、あなたが1つのクラスにを設定して宣言すれば、それはカスタムlessを含まない別のクラスに渡されます - その第2のクラスは異なる/未定義の振る舞いを持つ可能性があります。私は、セットの定義とアクセサーメソッドのすべてがカスタムの少ない特殊化を含んでいることを確認します。 –