所以我试图制作这个挑战:广度优先搜索:HackerRank的最短距离,但是当测试有大量的节点/边缘时,我一直得到错误的alloc异常。该程序适用于第一次测试,所以我不认为,实施有问题。 所以这是实现: (对不起缩进,我的第一个问题)
select
我做错了什么,我还没有看到其他人在网站的讨论部分抱怨此事。 我怎样才能避免抛出异常以及它从哪里来? 谢谢!
答案 0 :(得分:0)
我不确切地知道你的例外的原因是什么;并且我不知道如何重现你的问题,因为从输入值中取决于(我猜)。我猜想有很多输入值。
但是我看到了你的代码的一些弱点(恕我直言),所以我试着把注意力集中在它们上面。
1)您在std::queue
周期中分配for
queue <int> *que = new queue<int>();
但你永远不会释放它;这是浪费记忆
2)你正在使用C风格的可变长度数组
int dist[n + 1] = {-1};
bool visited[n + 1] = {false};
int parents[n + 1] = {-1};
它们不是有效的C ++标准代码。我建议您使用标准容器(std::vector
或std::queue
)。
3)您正在使用仅包含元素(-1
或false
)的初始化列表初始化C样式的可变长度数组。我想您的意图是使用n+1
和-1
初始化所有false
个元素。但是此语法仅使用-1
和false
初始化数组的第一个元素。
如果要将所有n+1
元素初始化为-1
和false
,解决方案是(再次)使用标准容器;通过例子
std::vector<int> dist(n+1, -1);
std::vector<bool> visited(n+1, false);
std::vector<int> parents(n+1, -1);
4)您无需检查边界即可访问数组。例如:
cin >> snode;
dist[snode] = 0;
其中snode
是int
变量;如果插入负值或超过n
的值,则会将dist
写出其边界,从而破坏内存。我想,这可以解释你的错误的分配异常&#34;。
建议:使用标准容器(再次)而不是C样式数组,并使用at()
(执行边界检查)而不是[]
;所以
cin >> snode;
dist.at(snode) = 0;
5)抱歉我的英语不好(好吧,我开玩笑说:这不是你的弱点之一;这是我的一个。)