如何解决重载运算符以获取指向结构的指针?C++
How to get around overloading an operator for a pointer to a struct? C++
我已经在这个问题上停留了很多小时,但我有一种感觉,有一个我看不到的微不足道的解决方案。我正在尝试使用priority_queue来创建指向我定义的结构的指针的 MinHeap。我的问题在于必须重载指向此结构的指针的> 运算符(我知道这是不可能的)以匹配priority_queue模板。这是我在决定放弃 stl 并编写自己的堆代码之前最后一次尝试使用 stl priority_queue。
我的代码的相关片段是:(i)结构定义的一部分:
typedef struct Node Node;
struct Node
{
int frequency;
bool operator>( const Node& other ) const{
return frequency > other.frequency;
}
};
(二) 优先队列初始化:
priority_queue<Node*,vector<Node*>,greater<Node*> > q;
(iii) 构造初始堆的 for 循环(假设int_array已被初始化):
for (int i = 0; i < SIZEOFINTARRAY; i++)
{
Node *n = new Node;
n->frequency = int_array[i];
q.push(n);
}
目前,此"堆"中的元素返回 FIFO,并且不会发生排序。我认为这是因为优先级比较会检查数组中较早的指针和元素位于内存中的较低位置。请给我任何关于如何完成此操作的提示。
对不起,如果这篇文章不符合堆栈溢出标准(我尽力遵守规则,但这是我的第一篇文章)。我欢迎所有的批评,所以我再也不会犯同样的错误了。
一种通用方法是实现一种deref_greater
,就像std::greater
一样,但首先取消引用输入参数。
template<class T>
struct deref_greater : public std::binary_function<T, T, bool>
{
bool operator()( const T& _Left, const T& _Right ) const
{
return *_Left > *_Right;
}
};
与其重载 Node 类上的 >
运算符,不如为Node*
指针实现一个比较器:
struct NodeGreater
{
bool operator() ( const Node* lhs, const Node* rhs ) const
{
if ( lhs == 0 || rhs == 0 )
{
// Perhaps throw an exception here...
}
return lhs->frequency > rhs->frequency;
}
};
priority_queue<Node*,vector<Node*>,NodeGreater> q;
相关文章:
- 如何循环打印顶点结构
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 预处理器:插入结构名称中的前一个行号
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 孤立代码块在结构中引发异常
- 有什么方法可以遍历结构吗
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 无法将结构注册为增强几何体3D点
- 多成员Constexpr结构初始化
- C++将文本文件中的数据读取到结构数组中
- 如何重构类层次结构以避免菱形问题
- 如何在C++中序列化结构数据
- std::vector的包装器,使数组的结构看起来像结构的数组
- 没有为自己的结构调用列表推回方法
- 结构块指的是什么?
- 自指结构
- 从文本中抓取句子,将所有句子分别存储在某个数据结构中
- 在 VideoInfoHeader2 结构时抓取帧