gpt4 book ai didi

C++ priority_queue 自定义比较器和删除任何项目

转载 作者:行者123 更新时间:2023-11-28 04:08:55 26 4
gpt4 key购买 nike

我正在研究最小堆的解决方案,除了自定义比较器之外,它还需要支持删除任何元素。完全自定义的堆实现是一种方法。但我想依靠 C++ STL 来进行所需的操作。
C++ 文档和 StackOverflow 答案 here指示我使用自定义类并重载自定义 remove 方法。我还在同一个类中重载了自定义比较器。

template<typename T>
class custom_priority_queue_MinHeap : public std::priority_queue<T, std::vector<T>>
{
public:
bool remove(const T& value)
{
auto it = std::find(this->c.begin(), this->c.end(), value);
if (it != this->c.end())
{
this->c.erase(it);
std::make_heap(this->c.begin(), this->c.end(), this->comp);
return true;
}

return false;
}

bool operator()(const pair<int, int> &a, const pair<int, int> &b)
{
cout << "Custom comparator called" << endl; <----------- Never called
return a.second > b.second;
}
};

自定义堆的消耗类似于:

custom_priority_queue_MinHeap<pair<int, int>> minHeap;
minHeap.push({0, 10});
minHeap.push({1, 5});
minHeap.push({2, 15});

while(!minHeap.empty())
{
pair<int, int> p = minHeap.top();
minHeap.pop();
cout << p.first << " " << p.second << endl;
}

Ideone 上运行时, minHeap push 未按预期工作。它在输出下方闪烁:

2 15
1 5
0 10

正确的输出应该是:

1 5
0 10
2 15

() 比较器重载从未被调用,这似乎是罪魁祸首。元素按照插入的顺序弹出。有趣的是,remove 功能运行良好。

问题:
是否可以完全依赖 C++ priority_queue STL 来实现所需的操作,即支持删除任何元素的自定义比较器?如果是,我在上述实现中是否遗漏了什么?

最佳答案

感谢 PaulMcKenzie 为我指明了正确的方向!问题是 priority_queue在STL中是三参数类。我的 impl 缺少第三个比较类参数。
以下更改效果很好。爱迪生link

class Comp
{
public:
bool operator()(const pair<int, int> &a, const pair<int, int> &b)
{
cout << "Custom comparator called" << endl;
return a.second > b.second;
}
};

template<typename T>
class custom_priority_queue_MinHeap : public std::priority_queue<T, std::vector<T>, Comp>
{
...
};

关于C++ priority_queue 自定义比较器和删除任何项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58224722/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com