【问题标题】:How to get around overloading an operator for a pointer to a struct? C++如何绕过重载运算符以获取指向结构的指针? C++
【发布时间】:2012-04-30 17:13:37
【问题描述】:

我已经被这个问题困扰了好几个小时,但我觉得有一个我没有看到的微不足道的解决方案。我正在尝试使用 priority_queue 创建指向我定义的结构的 MinHeap 指针。我的问题在于必须重载指向该结构的指针的 > 运算符(我知道这是不可能的)以匹配 priority_queue 模板。这是我在决定放弃它并编写自己的堆代码之前使用 stl priority_queue 的最后尝试。

我的代码的相关sn-ps是:(i)部分结构定义:

typedef struct Node Node;
struct Node
{
    int frequency;
    bool operator>( const Node& other ) const{
        return frequency > other.frequency;
    }
};

(ii) 优先队列初始化:

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);
}

目前,这个“堆”中的元素是先进先出的,没有排序发生。我认为这是因为优先级比较检查数组中较早的指针和元素位于内存中的较低位置。请给我一些关于如何完成此任务的提示。

PS。抱歉,如果这篇文章不符合 stackoverflow 标准(我尽力遵守规则,但这是我的第一篇文章)。我欢迎所有批评,所以我再也不会犯同样的错误了。

【问题讨论】:

  • 有什么原因不能在队列中使用 Node 作为值类型?另请注意,由于这是标记为 C++,因此不需要 typedef struct Node Node; 并且为您的 Node 结构提供构造函数以节省一些输入可能是个好主意
  • @stijn 我这样做是因为该结构还包含一些我在这里遗漏的 Node* 成员;这些 Node* 成员也是阻止我将 Node 设置为队列中的类型的原因,因为稍后在代码中我必须基本上重建队列(代码执行 Huffman 编码)
  • 如果你为你的节点实现一个交换,重建似乎仍然是可能的,不是吗?还是会导致性能问题?

标签: c++ pointers overloading operator-keyword priority-queue


【解决方案1】:

您可以为 Node* 指针实现一个比较器,而不是在 Node 类上重载 &gt; 运算符:

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;

【讨论】:

  • 这就像一个魅力。非常感谢。我想我对priority_queue 不够熟悉,而且我不知道我可以编写自己的比较器以在其模板的类比较槽中使用。这是一次很好的学习经历。
【解决方案2】:

一种通用的方法是实现一种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;
  }
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    相关资源
    最近更新 更多