派生自 std::p riority_queue 不使用比较器谓词/模板参数的类
Class derived from std::priority_queue does'nt use comparator predicate / template parameters
我不是很熟悉从模板派生,参见以下内容:
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
,因此所示的代码不会出现问题。
相关文章:
- std::设置自定义比较器
- C++中"std::sort"比较器的不同类型
- 将 std::set 与基于键的比较器一起使用
- 带自定义比较器的最小优先级队列
- 函数类作为比较器
- 优先级队列自定义比较器
- 什么是自定义比较器以及如何在 C++ 的排序函数中使用它?
- 没有默认构造函数作为模板参数的自定义比较器
- set_intersection使用自定义设置比较器
- 如何为集合 c++ 建立比较器
- C++复杂情况的比较器通过参数问题
- 对于BTreeMap和其他依赖于Ord的东西,是否有等效于C++比较器对象?
- 对没有比较器或λ函数的向量进行排序?
- "operator()"在重载运算符方法中是什么意思,在priority_queue(STL)中用作C++中的比较器?
- 用户定义的结构是否有默认C++比较器?
- C++设置了一个用于排序的比较器和另一个用于唯一性的比较器
- 使用迭代器的自定义比较器函数
- C++对λ比较器EXC_BAD_ACCESS进行排序
- 如果要求比较器是严格的总排序,而不仅仅是严格的弱排序,C++标准算法会更快吗?
- 派生自 std::p riority_queue 不使用比较器谓词/模板参数的类