C++ 构造堆

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值