如何解决重载运算符以获取指向结构的指针?C++

How to get around overloading an operator for a pointer to a struct? C++

本文关键字:结构 取指 指针 C++ 获取 何解决 解决 运算符 重载      更新时间:2023-10-16

我已经在这个问题上停留了很多小时,但我有一种感觉,有一个我看不到的微不足道的解决方案。我正在尝试使用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;