STL priority_queue复制比较器类

时间:2010-01-26 18:22:41

标签: c++ stl

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

std::priority_queue<int, std::vector<int>, MyComparator> pq;

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

  • 可以访问优先级队列所持有的MyComparator实例,或者:
  • 以某种方式通过引用传递原始的MyComparator实例

4 个答案:

答案 0 :(得分:10)

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

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

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

答案 1 :(得分:1)

我在使用std :: sort的比较器模板参数之前遇到过这种情况。定义一个合适的拷贝构造函数应该可以解决这个问题,例如:

class MyComparator
{
    public:

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

        // ...
};

除非您的比较器类很重(如果是这样,这会产生许多其他问题......)它不会引起太多问题。

答案 2 :(得分:0)

这很恶心,但您可以给MyComparator一个static MyComparator* me成员,然后重载复制构造函数以将此指针指定给this。可能有更好的方法,但没有想到任何事情。

答案 3 :(得分:0)

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

std::priority_queue<int, std::vector<int>, MyComparator&> pq;

但是IIRC有些情况下仍然不起作用,STL实现可能会强制复制。我不确定你的问题是否需要定义一个复制构造函数/赋值运算符来复制内部状态,尽管复制成本很高,这很痛苦。