c++ 仿函数与优先队列

引言:

在C++编程中,我们经常需要自定义数据结构的行为以满足特定的需求。优先队列(std::priority_queue)是一种非常有用的容器适配器,它提供了队列的接口,但其中的元素总是按照某种顺序(通常是最大或最小)进行排序。然而,默认情况下,std::priority_queue使用std::less<T>(对于最大堆)或std::greater<T>(对于最小堆)进行排序。但在很多情况下,我们可能需要根据自己的需求来定义排序规则。这时,仿函数就派上了用场。

仿函数(Function Object)简介:

仿函数是一种特殊的类,其对象可以像函数那样被调用。在C++中,我们只需要重载类的operator(),就可以将该类的对象当作函数来使用。仿函数的一个常见用途是作为算法的谓词(predicate),比如排序和搜索算法中的比较函数。

优先队列(std::priority_queue)简介:

std::priority_queue是一个容器适配器,它提供队列的所有操作,包括pushpoptop等,但其内部元素总是按照特定的顺序进行排序。默认情况下,最大元素总是在顶部(即最先被pop出来),但我们可以通过提供自定义的比较函数或仿函数来改变这个行为。

优先队列与仿函数模拟

template<class T>
    class less
    {
    public:
        bool operator()(const T& x, const T& y)
        {
            return x < y;
        }
    };
template<class T>
    class greater
    {
    public:
        bool operator()(const T& x, const T& y)
        {
            return x > y;
        }
    };
    template <class T, class Container = std::vector<T>, class Compare=less<T> >
    class priority_queue
    {
    public:
        void adjust_up(size_t child)
        {
            int partent = (child - 1) / 2;
            while (child > 0)
            {
                if (comp(partent, child))
                {
                    std::swap(c[partent], c[child]);
                    child = partent;
                    partent = (child - 1) / 2;
                }
                else
                {
                    break;
                }
            }
        }
        void push(const T& x)
        {
            c.push_back(x);
            adjust_up(c.size()-1);
        }
        void adjust_down(int parent)
        {
            int child = parent * 2 + 1;
            while (child < c.size())
            {
                if (child + 1 < c.size() && comp(c[child], c[child + 1]))
                {
                    ++child;
                }
                if (comp(c[parent], c[child]))
                {
                    std::swap(c[parent], c[child]);
                    parent = child;
                    child = parent * 2 + 1;
                }
                else
                {
                    break;
                }
            }
        }
        void pop()
        {
            std::swap(c[0], c[c.size() - 1]);
            c.pop_back();
            adjust_down(0);
        }

    private:

        Container c;

        Compare comp;

    };

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
优先队列是一种数据结构,它可以按照一定的优先级顺序对元素进行排序和访问。在 C++ 中,我们可以使用优先队列容器来实现这个功能。 优先队列容器是通过堆的数据结构实现的,所以在使用优先队列时,我们需要指定元素的比较方式。在 C++ 中,我们可以通过仿函数(function object)来定义比较规则。 仿函数是一种类对象,它可以像函数一样被调用。在优先队列中,我们需要定义一个仿函数来确定元素的优先级顺序。这个仿函数需要重载函数调用运算符 `operator()`,并根据自定义的比较规则来判断两个元素的优先级。 以下是一个示例代码,展示了如何使用仿函数来定义优先队列的比较规则: ```cpp #include <iostream> #include <queue> class MyCompare { public: bool operator()(int a, int b) { // 自定义比较规则,这里使用逆序 return a > b; } }; int main() { std::priority_queue<int, std::vector<int>, MyCompare> pq; pq.push(3); pq.push(1); pq.push(5); while (!pq.empty()) { std::cout << pq.top() << " "; pq.pop(); } return 0; } ``` 在上面的示例中,我们定义了一个名为 `MyCompare` 的仿函数类,重载了 `operator()` 运算符,使用逆序的方式来比较元素的优先级。然后,我们在创建优先队列时将 `MyCompare` 作为第三个参数传递进去,告诉优先队列使用这个仿函数来确定元素的优先级顺序。 当我们按照逆序的方式插入元素后,从优先队列中取出的元素会按照升序的方式输出。 希望这个示例可以帮助你理解如何使用仿函数来定义优先队列的比较规则。如有疑问,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值