C++ STL优先级\u队列复制比较器类

C++ STL优先级\u队列复制比较器类,c++,stl,C++,Stl,我正在尝试使用自定义比较器创建优先级队列: std::priority_queue<int, std::vector<int>, MyComparator> pq; std::优先级队列pq; 我的问题是MyComperator有一个存储附加状态的方法。因为MyComparator被复制到优先级队列(据我所知),所以我无法在优先级队列持有的MyComparator实例上调用此方法。有没有办法: 获取对优先级队列持有的MyComperator实例的访问权限,或者: 以

我正在尝试使用自定义比较器创建优先级队列:

std::priority_queue<int, std::vector<int>, MyComparator> pq;
std::优先级队列pq;
我的问题是MyComperator有一个存储附加状态的方法。因为MyComparator被复制到优先级队列(据我所知),所以我无法在优先级队列持有的MyComparator实例上调用此方法。有没有办法:

  • 获取对优先级队列持有的MyComperator实例的访问权限,或者:
  • 以某种方式通过引用传入原始MyComparator实例

这很恶心,但是您可以给您的MyComparator一个
静态MyComparator*me
成员,然后重载复制构造函数,将此指针分配给
This
。可能有更好的方法,但我想不起来。

您可以尝试在模板专业化中指定引用类型:

std::priority_queue<int, std::vector<int>, MyComparator&> pq;
std::优先级队列pq;

但IIRC在某些情况下,这仍然不起作用,STL实现可能会强制复制。从你的问题来看,我不确定你是否需要定义一个复制构造函数/赋值操作符来复制任何内部状态,尽管如果复制的代价很高,那会很痛苦。

我以前在使用std::sort的comparator模板参数时遇到过这个问题。定义一个合适的复制构造函数应该可以做到这一点,例如:

class MyComparator
{
    public:

        MyComparator(const MyComparator& other)
        {
            // copy members
        }

        // ...
};

除非您的comparator类很重(如果是的话,这会导致很多其他问题),否则它不应该引起太大的问题。

STL容器中使用的比较对象以及STL算法中使用的谓词必须是可复制的对象和方法,并且算法可以随意复制这些函数

这意味着,如果比较对象包含state,则必须正确复制该状态,因此可能需要提供合适的复制构造函数和复制赋值运算符


如果希望比较对象包含可变状态,那么问题就更复杂了,因为比较对象的任何副本都需要共享可变状态。如果可以将状态保持为单独的对象,则可以让比较对象保留指向此外部状态的指针;如果没有,您可能会发现您需要公共状态的共享所有权,因此您可能需要类似于
tr1::shared_ptr
的东西来管理它。

在我的STL实现中,通过引用传递MyComparator会生成编译时错误“将此指针分配给
this
”??无法重新分配
指针。如果共享状态改变了比较结果,则队列的行为未定义。