我从std :: priority_queue派生来实现一些专门的方法。其中之一 当我添加一个元素并且队列已满时,一些固定队列的方法,从队列中删除最小的元素。
template<typename T,
typename Sequence = std::vector<T>,
typename Compare = std::less<typename Sequence::value_type> >
class fixed_priority_queue : public std::priority_queue<T, Sequence, Compare> {
friend class BCQueue_; // to access maxSize_
public:
fixed_priority_queue(unsigned int maxSize)
: maxSize_(maxSize) {}
void insertWithOverflow(const T& x) {
if (this->size() == maxSize_) {
auto beg = this->c.begin();
auto end = this->c.end();
auto min = std::min_element(beg, end);
if(x > *min) {
*min = x;
std::make_heap(beg, end);
}
}
else {
this->push(x);
}
}
// ...
private:
fixed_priority_queue() {}
const unsigned int maxSize_;
};
这是我使用的比较器:
class ScoreLessThan : public std::binary_function<
std::shared_ptr<CCandidate>, std::shared_ptr<CCandidate>, bool> {
public:
bool operator()(
const std::shared_ptr<CCandidate>& a, const std::shared_ptr<CCandidate>& b) const {
return a->score > b->score;
}
};
我派生的fixed_priority_queue类我换行以保持功能稍微分开,所以最后我有这个:
class BCQueue_ : public fixed_priority_queue<
std::shared_ptr<CCandidate>, std::vector<std::shared_ptr<CCandidate> >, ScoreLessThan> {
public:
BCQueue_(size_t maxSize)
: fixed_priority_queue(maxSize) {}
bool willInsert(float score) {
return size() < maxSize_ || top()->score < score;
}
};
我可以这样使用:
BCQueue_ queue(30);
CCandidate
只是某些数据的持有者。一个属性是score
字段,我在上面的比较器中使用。
当我使用上面的类与CCandidate作为原始指针时,所有编译都有问题并且工作正常,现在我想用std::shared_ptr
替换原始指针(如上所述)并且我得到编译错误:
... 199:5: error: no match for ‘operator>’ in ‘x >min.__gnu_cxx::__normal_iterator::operator* [with _Iterator = std::shared_ptr*, _Container = std::vector >, __gnu_cxx::__normal_iterator::reference = std::shared_ptr&]()’
...
... :199:5: note: candidates are:
... :199:5: note: operator>(int, int)
... :199:5: note: no known conversion for argument 2 from ‘std::shared_ptr’ to ‘int’
也许这是一个简单的问题。如果我正确地定义了比较器或者我需要在insertWithOverflow()
x > *min
中更改比较,我并不是真的,实际上我不知道应该在那里改变什么。
我应该提一下,我已经在stackoverflow上找到了`insertWithOverflow'的实现,这恰好符合我的需要。见这里:How to make STL's priority_queue fixed-size
如上所述,使用原始指针这一切都没有问题。有人可以帮我解决这个问题。提前谢谢!
答案 0 :(得分:0)
您需要在函数中的任何位置使用指定的比较函数:
using std::priority_queue<T, Sequence, Compare>::comp;
void insertWithOverflow(const T& x) {
if (this->size() == maxSize_) {
auto beg = this->c.begin();
auto end = this->c.end();
auto min = std::min_element(beg, end, comp);
if(comp(*min, x)) {
*min = x;
std::make_heap(beg, end, comp);
}
}
else {
this->push(x);
}
}