比較関数演算子 () 内から 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 つのキーk1
とk2
は、比較対象comp
,の場合、同等と見なされますcomp(k1, k2) == false && comp(k2, k1) == false
。同じコンテナー内の任意の 2 つのキー k1 と k2 について、呼び出しcomp(k1, k2)
は常に同じ値を返します。