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==on 键强加的等价关系。也就是说,如果对于比较对象, ,则两个键k1k2被认为是等效的。对于同一容器中的任意两个键 k1 和 k2,调用应始终返回相同的值compcomp(k1, k2) == false && comp(k2, k1) == falsecomp(k1, k2)

于 2013-04-28T09:29:54.107 回答