VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 240|回复: 10
打印 上一主题 下一主题

[已解决] 基本语法崩溃问题

[复制链接]
38_avatar_middle
跳转到指定楼层
1#
online_vip 发表于 2019-9-26 20:17:15 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 2191265529 于 2019-9-27 10:13 编辑

MaxHeap.h文件如下:
  1. #pragma once
  2. #ifndef _MAX_HEAP_
  3. #define _MAX_HEAP_

  4. template <class T>
  5. class MaxHeap
  6. {
  7. public:
  8.         MaxHeap(int mx = 10);
  9.         ~MaxHeap();
  10.         bool isEmpty();
  11.         void Push(T e);
  12.         T& Top();
  13. private:
  14.         T* maxHeap;
  15.         int maxSize;
  16.         int currentSize;

  17.         void trickleUp(int index);
  18.         void trickleDown(int index);
  19. };

  20. template <class T>
  21. MaxHeap<T>::MaxHeap(int mx)
  22. {
  23.         maxSize = mx;
  24.         maxHeap = new T(mx);
  25. }

  26. template <class T>
  27. bool MaxHeap<T>::isEmpty()
  28. {
  29.         return currentSize == 0;
  30. }

  31. template <class T>
  32. MaxHeap<T>::~MaxHeap()
  33. {
  34.         delete[] maxHeap;
  35. }

  36. template <class T>
  37. void MaxHeap<T>::Push(T e)
  38. {
  39.         if (currentSize == maxSize)        throw "MaxHeap is full";
  40.         maxHeap[currentSize] = e;
  41.         trickleUp(currentSize++);
  42. }

  43. template <class T>
  44. void MaxHeap<T>::trickleUp(int index)
  45. {
  46.         T bottom = maxHeap[index];
  47.         while (index > 0 && maxHeap[index - 1 >> 1] < maxHeap[index])
  48.         {
  49.                 maxHeap[index] = maxHeap[index - 1 >> 1];
  50.                 index = index - 1 >> 1;
  51.         }
  52.         maxHeap[index] = bottom;
  53. }

  54. template <class T>
  55. T& MaxHeap<T>::Top()
  56. {
  57.         if (currentSize <= 1)        throw "maxheap is empty!";
  58.         return maxHeap[0];
  59. }
  60. #endif
复制代码


main.cpp文件如下:
  1. #include <iostream>
  2. #include "MaxHeap.h"

  3. using namespace std;

  4. int main()
  5. {
  6.         MaxHeap<int> h;
  7.         h.Push(20);
  8.         h.Push(10);
  9.         h.Push(30);

  10.         cout << h.Top() << endl;

  11.         system("pause");
  12.         return 0;
  13. }
复制代码


程序这里cout << h.Top() << endl; 会蹦溃什么情况,Top()函数的定义返回值不是引用的话也会崩溃,按理说,return会产生一个副本啊?

111.jpg (85.37 KB, 下载次数: 13)

111.jpg




上一篇:Qt不能再当前代码也表示字符问题
下一篇:SOCKET TCP服务器,客户端一断开cpu占用就飙升
84_avatar_middle
2#
在线会员 发表于 2019-9-26 22:14:34 | 只看该作者
看不懂啊。currentsize没赋值,一开始就是判断,99.999&是false,到trickleup的时候,current还是没赋值,也就是说程序根本不知道在哪运行什么
84_avatar_middle
3#
在线会员 发表于 2019-9-26 22:23:34 | 只看该作者
if (currentSize == maxSize)        throw "MaxHeap is full";
        maxHeap[currentSize] = e;
currentsize为10的话还能运行吗?
MaxHeap(int mx = 10);
maxSize = mx;
        maxHeap = new T(mx);
84_avatar_middle
4#
在线会员 发表于 2019-9-26 22:28:59 | 只看该作者
说实话,我从构造开始,全程懵逼。。。完全没看懂你准备做什么
38_avatar_middle
5#
ico_lz  楼主| 发表于 2019-9-27 10:13:01 | 只看该作者
magshines 发表于 2019-9-26 22:28
说实话,我从构造开始,全程懵逼。。。完全没看懂你准备做什么

maxHeap = new T(mx);
是这一句写错了,应该是new T[mx];
这是个堆排序,currentSize是类成员,没有赋值,默认是为0
84_avatar_middle
6#
在线会员 发表于 2019-9-27 12:09:11 | 只看该作者
2191265529 发表于 2019-9-27 10:13
maxHeap = new T(mx);
是这一句写错了,应该是new T[mx];
这是个堆排序,currentSize是类成员,没有赋 ...

以前有个人问过问题,就是没初始化类成员运行出错,所以建议你初始化下先
84_avatar_middle
7#
在线会员 发表于 2019-9-27 12:14:17 | 只看该作者
2191265529 发表于 2019-9-27 10:13
maxHeap = new T(mx);
是这一句写错了,应该是new T[mx];
这是个堆排序,currentSize是类成员,没有赋 ...

如果currentsize默认为0,你可以看下你的push语句,你调用一次,currentsize自增一次,不调用就一直是0,然后maxheap作为数组,最大为10个元素,你给的数都大于9,你数组怎么运行
84_avatar_middle
8#
在线会员 发表于 2019-9-27 12:19:28 | 只看该作者
本帖最后由 magshines 于 2019-9-27 12:21 编辑
2191265529 发表于 2019-9-27 10:13
maxHeap = new T(mx);
是这一句写错了,应该是new T[mx];
这是个堆排序,currentSize是类成员,没有赋 ...


push实现不对,不是循环,不然你调用9次push,maxheap数组都没被赋值,第10次调用push后才又超出数组长度,没有意义啊
38_avatar_middle
9#
ico_lz  楼主| 发表于 2019-9-28 22:52:23 | 只看该作者
magshines 发表于 2019-9-27 12:19
push实现不对,不是循环,不然你调用9次push,maxheap数组都没被赋值,第10次调用push后才又超出数组长 ...

push没有循环,trickleUp是对堆进行调整,保持推一直是个有序的状态
84_avatar_middle
10#
在线会员 发表于 2019-9-28 22:56:16 | 只看该作者
2191265529 发表于 2019-9-28 22:52
push没有循环,trickleUp是对堆进行调整,保持推一直是个有序的状态

你可以看下,不循环你if语句基本没用,等到有用的时候超出数组长度了,还怎么运行?
84_avatar_middle
11#
在线会员 发表于 2019-9-28 22:58:42 | 只看该作者
2191265529 发表于 2019-9-28 22:52
push没有循环,trickleUp是对堆进行调整,保持推一直是个有序的状态

push的if语句实现不对。导致数组根本没有赋值到长度了数组下标超出数组长度
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-10-10 01:30

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表
时时彩平台排名