1.结构体-构造堆
运算符 | 构造语句 | 构造堆类型 | 堆顶元素 |
---|---|---|---|
默认 | make_heap(data.begin(), data.end()); | 大顶堆 | 最大值 |
< | make_heap(data.begin(), data.end(), less()); | 大顶堆 | 最大值 |
> | make_heap(data.begin(), data.end(), greater()); | 小顶堆 | 最小值 |
include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct node {
int age;
node(int a) {
age = a;
}
bool operator<(node a) const { /* 大顶堆 */
return age < a.age;
}
bool operator>(node a) const { /* 小顶堆 */
return age > a.age;
}
};
int main() {
node a1(4);
node a2(6);
node a3(2);
std::vector<int> data = {5, 2, 9};
// 1.默认构造大顶堆
make_heap(data.begin(), data.end());
/* 获取堆顶 */
pop_heap(data.begin(), data.end());
cout << data.back() << endl; /* 输出最大值 */
// 2.大顶堆,比较函数 <
make_heap(data.begin(), data.end(), less<int>());
/* 获取堆顶 */
pop_heap(data.begin(), data.end(), less<int>());
cout << data.back() << endl; /* 输出最大值 */
// 3.小顶堆,比较函数 >
make_heap(data.begin(), data.end(), greater<int>());
/* 获取堆顶 */
pop_heap(data.begin(), data.end(), greater<int>());
cout << data.back() << endl; /* 输出最小值 */
return 0;
}
2.结构体指针-构造堆
一般情况下大多数都是结构体对象构建堆,这个网上很常见,但是当vector<heap_timer_node *> array; ** 堆指针数组 **时,网上的比较少。
这个只是个半成品,在写最小堆定时器时测试堆构建是否成功的过程中的内容,但是能够运行,目的是说明当vector是结构体指针的时候如何构建大顶堆或小顶堆,关键在于cmp函数。
- heap_timer.h
//
// Created by yongpu on 2019/12/16.
//
#ifndef HEAP_TIMER_HEAP_TIMER_H
#define HEAP_TIMER_HEAP_TIMER_H
#include <iostream>
#include <netinet/in.h>
#include <time.h>
#include <vector>
#include <algorithm>
using namespace std;
#define BUFFER_SIZE 64
struct client_data;
/* 定时器类 */
class heap_timer_node {
public:
heap_timer_node(int delay) {
expire = delay;
}
public:
time_t expire; /* 定时器生效的绝对时间 */
};
bool cmp(heap_timer_node *node1, heap_timer_node *node2);
/* 时间堆类 */
class timer_heap {
public:
timer_heap(int cap);
void add_timer(heap_timer_node *timer) ;
heap_timer_node *get_top() ; /* 获得堆顶部的定时器 */
private:
vector<heap_timer_node *> array; /* 堆数组 */
int capacity; /* 堆数组的容量 */
int cur_size; /* 堆数组中当前的元素个数 */
};
/* 绑定socket和定时器 */
struct client_data {
sockaddr_in address;
int sockfd;
char buf[BUFFER_SIZE];
heap_timer_node *timer;
};
#endif //HEAP_TIMER_HEAP_TIMER_H
- heap_timer.cpp
//
// Created by yongpu on 2019/12/16.
//
#include "heap_timer.h"
bool cmp(heap_timer_node *node1, heap_timer_node *node2) {
return node1->expire > node2->expire;
}
/* 构造函数 */
timer_heap::timer_heap(int cap) {
this->array.resize(cap);
this->cur_size = 0;
for (int i = 0; i < cap; i++) {
this->array[i] = nullptr;
}
make_heap(array.begin(), array.begin() + cur_size, cmp);
}
/* 添加一个定时器 */
void timer_heap::add_timer(heap_timer_node *timer) {
if (timer == nullptr) {
return;
}
if (cur_size >= capacity) { /* 无空间,则将array扩大一倍 */
resize();
}
/* 插入新元素 */
array[cur_size] = timer;
cur_size++;
/* 调整堆 */
push_heap(array.begin(), array.begin() + cur_size, cmp);
}
/* 获取堆顶元素 */
heap_timer_node *timer_heap::get_top() {
cout << array[0]->expire << endl;
return nullptr;
}
- main.cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include "heap_timer.h"
using namespace std;
int main() {
heap_timer_node *node1 = new heap_timer_node(6);
heap_timer_node *node2 = new heap_timer_node(2);
heap_timer_node *node3 = new heap_timer_node(4);
heap_timer_node *node4 = new heap_timer_node(11);
heap_timer_node *node5 = new heap_timer_node(5);
timer_heap heaps(10);
heaps.add_timer(node1);
heaps.add_timer(node2);
heaps.add_timer(node3);
heaps.add_timer(node4);
heaps.add_timer(node5);
heaps.get_top();
return 0;
}
cmp函数是构建大顶堆还是小顶堆的标志:
bool cmp(heap_timer_node *node1, heap_timer_node *node2) {
return node1->expire > node2->expire;
}
// cmp是 > ,故而是小顶堆;
// 如改为 < ,则是大顶堆。
- 运行输出:
/home/yongpu/NetCode/heap_timer/cmake-build-debug/heap_timer
2
Process finished with exit code 0