派生自 std::p riority_queue 不使用比较器谓词/模板参数的类

Class derived from std::priority_queue does'nt use comparator predicate / template parameters

本文关键字:谓词 比较器 参数 std riority queue 派生      更新时间:2023-10-16

我不是很熟悉从模板派生,参见以下内容:

class BCQueue_;
template<typename T,
         typename Sequence = std::vector<T>,
         typename Compare = std::less<typename Sequence::value_type> >
class FixedPriorityQueue : public std::priority_queue<T> {
    friend class BCQueue_; // to access private member maxSize_
public:
    FixedPriorityQueue(unsigned int maxSize) 
    : maxSize_(maxSize) {}
    // smallest item will be dropped if queue id full
    void insertWithOverflow(const T& x) {
        // ...
        this->push(x);
        // ...
    }
private:
    FixedPriorityQueue() {}
    const unsigned int maxSize_;
};
class ScoreLessThan : public std::binary_function<CCandidate *, CCandidate *, bool> {
public:
    bool operator()(
        const CCandidate * a, const CCandidate * b) const {
        std::wcout << a->score << " < " << b->score << std::endl;
        return a->score > b->score;
    }
};
class BCQueue_ : public FixedPriorityQueue<
    CCandidate *, std::vector<CCandidate *>, ScoreLessThan> {
public:
    BCQueue_(size_t maxSize)
    : FixedPriorityQueue(maxSize)   {}
    bool willInsert(float score) {
        return size() < maxSize_ || top()->score < score;
    }
};
BSQueue bc(20);
bs.insertWithOverflow(new CCandidate( ... ));
// ...

在FixedPriorityQueue中,我有一个名为insertWithOverflow的方法,通过删除最小的元素来插入元素(如果队列已满)。为了使事情稍微分开,我从FixedPriorityQueue派生。基本上所有工作都很好,除了比较器ScoreLessThan似乎从未被调用。当我在顶部/弹出元素时,它们的顺序与我期望的(分数)不同。

所以这可能是一个语法/用法问题,请原谅我,但我找不到任何答案来解决这个问题。我认为通过定义模板参数,一切都会解决。我在这里错过了什么?

谢谢你的帮助!

问题在这里

template<typename T,
         typename Sequence = std::vector<T>,
         typename Compare = std::less<typename Sequence::value_type> >
class FixedPriorityQueue : public std::priority_queue<T> {
//               Wrong base class ^^^^^^^^^^^^^^^^^^^^^^

任何FixedPriorityQueue<A,B,C>都来自std::priority_queue<A,(default),(default)>

修改它,使基类使用相同的模板参数。

template<typename T,
         typename Sequence = std::vector<T>,
         typename Compare = std::less<typename Sequence::value_type> >
class FixedPriorityQueue : public std::priority_queue<T,Sequence,Compare> {

警告:一些有经验的人会告诉你永远不要从标准库容器类派生。(为什么)

为了给您留一些余地,我将只警告您不要在类中添加显式析构函数,也不要添加具有重要析构函数的成员变量。由于您唯一的成员是unsigned int,因此所示的代码不会出现问题。