C++ STL set:将对象与外部状态进行比较

sch*_*ttl 5 c++ stl compare set

这个定义在以下内容中OuterClass:

struct Compare
{
    bool operator ()(const T&, const T&);
};
typedef set<T, Compare> MySet;
Run Code Online (Sandbox Code Playgroud)

我的问题是比较函数operator ()取决于状态OuterClass.(MySet在算法期间使用实例进行优化,并且它们必须在不同阶段进行不同的排序.)

有什么方法/解决方法可以OuterClass从比较函数中访问非静态成员operator ()吗?

And*_*owl 5

有没有办法/解决方法从比较函数operator()中访问OuterClass的非静态成员?

有.只需编写一个用户定义的构造函数Compare,接受并存储引用OuterClass,这样:

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

然后,当您创建集合时,您可以执行以下操作:

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
}
Run Code Online (Sandbox Code Playgroud)

但请注意:订购标准应保持稳定.元素必须始终对同一组进行比较.根据C++ 11标准的第23.2.4/3段:

短语"等价键"是指比较而不是operator==开键所施加的等价关系 .即,两个键k1k2被认为是等价的,如果为比较对象comp,comp(k1, k2) == false && comp(k2, k1) == false.对于同一容器中的任意两个键k1和k2,调用comp(k1, k2)应始终返回相同的值.