5

この定義は次の内部にありOuterClassます。

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

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

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

4

1 に答える 1

6

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

がある。Compare次のように、への参照を受け入れて格納するためのユーザー定義のコンストラクターを作成するだけOuterClassです。

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

次に、セットを作成するときに、次のようなことができます。

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
}

ただし、注意してください: 順序付け基準は安定している必要があります。要素は、同じセットに対して常に同じものを比較する必要があります。C++11 標準のパラグラフ 23.2.4/3 によると:

「キーの等価性」という語句は、キーではなく、比較によって課せられる等価関係を意味 operator==します。つまり、2 つのキーk1k2は、比較対象comp,の場合、同等と見なされますcomp(k1, k2) == false && comp(k2, k1) == false同じコンテナー内の任意の 2 つのキー k1 と k2 について、呼び出しcomp(k1, k2)は常に同じ値を返します

于 2013-04-28T09:29:54.107 に答える