我正在尝试使用随机版本的Prim算法生成图形的生成树。但是,我的程序在生成树生成阶段崩溃,仔细检查发现了三个不同的错误。
1)在usedEdges.push_back(*i);
(在下面的代码中)收到SIGTRAP,其中usedEdges
的类型为std::vector<Edge>
。
2)在图表的代码中收到SIGTRAP,行非常相似:edges_[edge.From()].push_back(edge);
,其中edges_
的类型为std::vector<std::list<Edge> >
3)有几次,当我尝试将边缘的信息打印到终端时,我收到了一个SEGFAULT,虽然我无法重现它很多次。
如果我理解正确,我收到SIGTRAP的事实意味着Windows因内存损坏而触发某种错误?如果是这样,我的记忆在哪里被破坏了?
生成生成树的代码如下。 maze_
成员是一个图表,它在内部存储节点&amp;矢量和矢量中的边缘邻接清单。
typedef std::set<int> NodeSet;
typedef std::list<Edge> EdgeList;
typedef std::vector<EdgeList> AdjacencyList;
AdjacencyList adjacencyList;
std::vector<Edge> usedEdges;
NodeSet usedNodes;
//generate grid nodes
for (int i = 0; i < height_; i++)
{
for (int j = 0; j < width_; j++)
{
Node node(maze_.GetNextFreeNodeIndex());
//nodes.push_back(node);
maze_.AddNode(node);
adjacencyList.push_back(std::list<Edge>());
}
}
//generate grid edges
for (int i = 0; i < height_; i++)
{
for (int j = 0; j < width_; j++)
{
int k = i * width_ + j;
if (i > 0)
{
Edge edge(k, k - width_);
adjacencyList[k].push_back(edge);
}
if (i < height_ - 1)
{
Edge edge(k, k + width_);
adjacencyList[k].push_back(edge);
}
if (j > 0)
{
Edge edge(k, k - 1);
adjacencyList[k].push_back(edge);
}
if (j < width_ - 1)
{
Edge edge(k, k + 1);
adjacencyList[k].push_back(edge);
}
}
}
///Randomized Prim's algorithm
//mark first used node, and add all edges leading from this node to the used edge list.
usedNodes.insert(0);
EdgeList edgeList = adjacencyList[0];
for (EdgeList::iterator i = edgeList.begin(); i != edgeList.end(); i++)
{
usedEdges.push_back(*i);
}
while (!usedEdges.empty())
{
int id = LC::rand() * usedEdges.size() - 0.5;
Edge edge = usedEdges[id];
if (usedNodes.find(edge.To()) == usedNodes.end())
{
maze_.AddEdge(edge);
usedNodes.insert(edge.To());
edgeList = adjacencyList[edge.To()];
for (EdgeList::iterator i = edgeList.begin(); i != edgeList.end(); i++)
{
usedEdges.push_back(*i);
}
}
else
{
usedEdges.erase(usedEdges.begin() + id - 1);
}
}
到目前为止我尝试过的事情: 重建项目,尝试将实际断点设置到代码中以观察变量,但到目前为止还没有看到任何与众不同的东西。然后我再也不确定我应该寻找什么......
修改
Edge类声明是
class Edge
{
public:
//Edge(const Edge& edge);
Edge(int from, int to, float cost);
Edge(int from, int to);
Edge();
virtual ~Edge();
friend std::ostream& operator<<(std::ostream& os, const Edge& edge);
int From() const;
void SetFrom(int index);
int To() const;
void SetTo(int index);
float Cost() const;
void SetCost(float cost);
bool operator==(const Edge& rhs);
bool operator!=(const Edge& rhs);
protected:
int from_;
int to_;
float cost_;
};