📜  堆 pinter c++ (1)

📅  最后修改于: 2023-12-03 14:51:37.714000             🧑  作者: Mango

堆(Heap)在C++中的应用

堆(Heap)是一种常用的数据结构,它通常用于动态分配内存和优先队列的实现。在C++中,我们可以使用STL的heap函数和priority_queue类来方便地使用堆。

STL的heap函数

STL的heap函数位于头文件中,它可以将一个数组或者容器(如vector)转换为堆。heap函数接受三个参数:

template<class RandomAccessIterator>
void make_heap(RandomAccessIterator first, RandomAccessIterator last);

其中,first和last是指向容器中元素的迭代器。make_heap函数将[first, last)范围内的元素转换为一个堆,这些元素可以是任何可比较的类型。

我们可以使用push_heap函数将新元素添加到堆中,同时保持堆的性质:

template<class RandomAccessIterator>
void push_heap(RandomAccessIterator first, RandomAccessIterator last);

此函数将[first, last)中的最后一个元素插入到堆中,并保证heap顺序。

而pop_heap函数可以将堆顶元素(最大元素)移动到容器的最后一个元素,同时重新构建剩余的元素使其成为新的heap:

template<class RandomAccessIterator>
void pop_heap(RandomAccessIterator first, RandomAccessIterator last);

尽管该函数将尚未排序的序列elements的堆顶元素存放到序列的尾部,但它并没有将该元素从序列中移除。我们可以通过容器的pop_back方法将该元素从容器中删除。

完整的使用示例:

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int main() {
    int a[] = {5, 3, 2, 1, 4};
    vector<int> v(a, a + 5);

    make_heap(v.begin(), v.end());
    for (auto x : v) {
        cout << x << " ";
    }
    cout << endl;

    v.push_back(6);
    push_heap(v.begin(), v.end());
    for (auto x : v) {
        cout << x << " ";
    }
    cout << endl;

    pop_heap(v.begin(), v.end());
    v.pop_back();
    for (auto x : v) {
        cout << x << " ";
    }

    return 0;
}

输出:

5 4 2 1 3
6 4 2 1 3 5
5 4 2 1 3
priority_queue类

priority_queue类封装了STL的heap函数,它是一个自带堆的容器类。同样地,priority_queue也支持STL中的基本操作,如push、pop、top。

我们可以通过以下方式来创建priority_queue:

template<class T, class Container = vector<T>,
         class Compare = less<typename Container::value_type> >
class priority_queue;

其中,T是元素类型,Container是底层容器类型,默认是vector,Compare是比较函数类型,它可以使用stl的greater和less分别表示大根堆和小根堆。

我们可以通过以下方式来创建一个小根堆:

#include <iostream>
#include <queue>

using namespace std;

int main() {
    priority_queue<int, vector<int>, greater<int>> pq;
    pq.push(3);
    pq.push(1);
    pq.push(5);
    pq.push(2);
    while (!pq.empty()) {
        cout << pq.top() << " ";
        pq.pop();
    }
    return 0;
}

输出:

1 2 3 5

以上就是堆在C++中的使用介绍,希望这篇文章能够对你有所帮助。