作者takua624 (TAKUA)
看板EE_DSnP
标题[问题] HW5传说中的多叫了constructor
时间Sun Nov 27 17:45:46 2011
是array遇到的问题是也!
在使用adta -r 的时候,原本都还很顺利,跑出来的随机值也跟参考档案一样
但是只要一reset,问题就出现了!
adta -r 10
adtp
adtr 3
adta -r 1
adtp
adta -r 1
adtp
......(重复二三十次)
RESET之後第一个加进去的数,跟参考档案一样
但第二个加进去的,在参考档案中却是在第三个才出现
第三个 ====> 第六个
第四个 ====> 第十一个
第五个 ====> 第十二个
第六个以後就疑似永远丢失了,在参考档案中找不到相同的值
这当然就是传说中的多叫了constructor吧...
可是我根本不知道是哪里会需要呼叫constructor,而且只要不RESET就没问题
RESET前跟RESET後可能有什麽差别吗?
我的RESET就只是把三个data member全部设成零,这不就回到最初的纯洁状态了吗?
到底...能有什麽差别呢?
--
春
苑树雪菜萌苗,
雀儿喜上夏枝梢;
蓝眼望尽
黄泉路,只盼俪人一
美笑。
长巾初解投送抱,金
珠丽叶贺新好;
神代仙眷且羡嫉,长伴相随誓到老。
静马千华留秋晚,冬风不止
三乡道;
红枝立约携手情,今此空余泣嚎啕。
姬宫千歌音悠悠,
樱井奏乐声袅袅;奈何天令伊人变,
飞离斯爱离斯去。
结城AIRA→ 悲恸独泣无人应,
白昼梦尽皆空语。
←美乡あき
Kalafina→ 红月旋响戚
音乐,黯然步上
镇魂旅。
←飞 兰
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.4.196
1F:推 shryuhuai:reset不用清除记忆体 11/27 17:48
2F:→ takua624:我有看到这句,不过不懂意思。是指_data不用变成零吗? 11/27 17:59
3F:→ e124553423:意思是reset时不用delete[] (保留array的_capacity) 11/27 18:02
4F:→ e124553423:修改_size就好 11/27 18:03
5F:→ e124553423:当然_data也就不能动罗(不然就找不到那块记忆体了 11/27 18:06
上一个问题好像解决了,但又有新的没天良的情况出现:
我的DO2结果跟参考档案有微妙的差异。
於是我就把DO2修改一下,把出现的那三个大得要命的数字改掉:
5000、50000、10000改成50、500、100
结果跟参考档一样。
後来慢慢增加,一路加到5000、45000、8000,结果还是跟参考档一样
似乎偏偏就是DO2不行。
教授说乱数的产生跟执行速率无关,可是...
※ 编辑: takua624 来自: 140.112.4.196 (11/27 18:49)
6F:→ e124553423:你是指执行时间吗? 11/27 19:45
7F:→ e124553423:搜寻的时候用binary search会比较快喔~ 11/27 19:48
8F:→ e124553423:如果是记忆体使用比较大的话,可能是有些函数中间产生 11/27 19:55
9F:→ e124553423:的动态记忆体没有删掉导致越积越多 11/27 19:55
10F:推 ric2k1:这个... 我觉得还是不要花时间调它吧,可以先看 bst 11/27 21:42
这个状况也解决了。原来是我的insert(T& x)在检查x是否已存在於array之前
就先判断需不需要扩充array,
例如今天array的内容是 nba mlb cwt gto fta ric ntu swr
size = capacity = 8
如果程式随机产生了一个ric,错误的insert会先把capacity扩充成16,
结果发现ric已经有了,所以什麽都没存进去。
正确的insert是先发现ric已经在array里面,所以决定什麽都不动,直接return false
会多呼叫constructor就是"明明没有要加东西,还resize原本的array"造成的。
希望这样写可以对爬文的同胞有帮助。
※ 编辑: takua624 来自: 61.57.147.96 (11/28 17:05)
11F:→ e124553423:我是觉得先扩充没什麽差欸,反正之後还是有机会用到XD 11/28 17:18
12F:→ takua624:如果很执着要让结果跟参考档案一样的话那就有差 11/28 22:41
13F:→ takua624:那样写当然是对的啦 11/28 22:41