2010-01-26 74 views
4

我试图创建一个优先级队列使用自定义比较:STL priority_queue副本比较级

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

我的问题是MyComparator具有存储附加状态的方法。由于MyComparator复制到优先级队列中(据我所知),因此我无法在优先级队列所持有的MyComparator实例上调用此方法。有没有什么办法可以:

  • 可以访问由优先级队列举行的MyComparator实例,或者:
  • 莫名其妙按引用传递的原始MyComparator比如在

回答

10

比较对象是自由复制这些功能然而他们的愿望。

这意味着,如果你的比较对象包含状态,这种状态必须被正确地复制,所以你可能需要提供合适的拷贝构造函数和拷贝赋值运算符。

如果你想你的比较对象containt可变状态则问题更为复杂,因为你的比较对象的任何副本需要共享可变状态。如果你可以将状态保持为一个独立的对象,那么你可以让你的比较对象保持一个指向这个外部状态的指针;如果不是的话,你可能会发现你需要共同所有权的共同国家,所以你可能会需要像tr1::shared_ptr来管理这个。

+1

。 – frast 2010-10-28 15:43:11

0

这是令人厌恶的,但你可以给你的MyComparator一个static MyComparator* me成员,然后重载拷贝构造函数,把这个指针分配给this。可能有更好的方法,但没有想到。

+2

'将此指针赋给'this''?你不能重新分配'this'指针。 – 2010-01-26 18:45:34

0

您可以尝试在模板特指定引用类型:

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

但IIRC存在该仍然不工作,STL实现可能迫使副本反正案件。我不确定你的问题是否需要定义一个复制构造函数/赋值运算符来复制任何内部状态,尽管如果复制代价昂贵,这是很痛苦的。

+0

我在执行STL的,通过引用传递MyComparator如果共享状态改变的比较,则队列的行为是未定义IMHO的结果产生编译时间错误 – thekidder 2010-01-26 18:28:31

+0

参考是不可复制 – 2010-01-26 18:46:07

1

我在std :: sort的比较模板参数之前遇到过这个问题。定义一个适当的拷贝构造函数应该做的伎俩,例如:

class MyComparator 
{ 
    public: 

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

     // ... 
}; 

除非你的比较类是沉重的(如果是的话,那会导致很多其他的问题。)它应该不会造成太大的问题。在STL容器以及在STL算法中使用的必须可拷贝的对象和方法和algorthims谓词中使用