2013-04-28 11 views
5

この定義はOuterClassの内側にある:C++ STLセット:外因性の状態でオブジェクトを比較

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

私の問題は、機能operator()を比較するにはOuterClassの状態に依存していることです。 (MySetインスタンスが最適化のためのアルゴリズムの中に使用されていると、彼らはさまざまな段階で異なってソートする必要があります。)

は比較関数operator()内からOuterClassの非静的メンバーにアクセスする方法/回避策はありますか?

答えて

5

OuterClassの非静的メンバーにcompare function operator()内からアクセスする方法はありますか?

あります。

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 
} 

注意してください:あなたはあなたのセットを作成するときに、あなたのような何かを行うことができ、その後

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

:ちょうど受け入れ、OuterClassへの参照を格納Compareためのユーザー定義のコンストラクタ、この方法を書きます注文の基準は安定していなければなりません。要素は、同じセットに対して常に同じものを比較しなければなりません。 C++ 11標準の段落23.2.4/3あたり:

フレーズ「キーの等価性は」比較していないキーの operator==によって課される同値関係を意味しています。すなわち、​​とk2の2つのキーは、比較の場合、 オブジェクトcompcomp(k1, k2) == false && comp(k2, k1) == falseの場合、同等とみなされます。 同じコンテナの 内の任意の2つのキーk1とk2については、comp(k1, k2)を呼び出すと常に同じ値が返されます。

+0

ああ、私は設定されたコンストラクタを見るのを忘れていたので、自分でコンパレータオブジェクトを作成できることを認識できませんでした。 C++ 11標準に関するヒントをありがとう - 私はこれを念頭に置いています:)ありがとう! – schoettl

+0

@ user999007:あなたのプロジェクトで幸いです。) –