这个定义在里面OuterClass
:
struct Compare
{
bool operator ()(const T&, const T&);
};
typedef set<T, Compare> MySet;
我的问题是比较功能operator ()
取决于OuterClass
. (MySet
实例在算法中用于优化,它们必须在不同阶段进行不同的排序。)
是否有任何方法/解决方法可以OuterClass
从比较函数中访问非静态成员operator ()
?
是否有任何方法/解决方法可以从比较函数运算符 () 中访问 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==
on 键强加的等价关系。也就是说,如果对于比较对象, ,则两个键k1
和k2
被认为是等效的。对于同一容器中的任意两个键 k1 和 k2,调用应始终返回相同的值。comp
comp(k1, k2) == false && comp(k2, k1) == false
comp(k1, k2)