我正在尝试使用自定义比较器创建优先级队列:
std::priority_queue<int, std::vector<int>, MyComparator> pq;
我的问题是MyComparator有一个存储附加状态的方法。因为MyComparator被复制到优先级队列(据我所知),我无法在优先级队列所持有的MyComparator实例上调用此方法。有没有办法:
答案 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实现可能会强制复制。我不确定你的问题是否需要定义一个复制构造函数/赋值运算符来复制内部状态,尽管复制成本很高,这很痛苦。