class Graph //part of graph.h, functions go in graph.cpp (functions not shown)
{
private:
vector< list<Edge> > adjList; //Vector of Lists (sort of like a 2D array)
public:
Graph(){}
~Graph(){}
class Edge
{
public:
Edge(string vertex, int weight)
{
m_vertex = vertex;
m_weight = weight;
}
~Edge(){}
string m_vertex;
int m_weight;
};
vector < list < Edge > >& get_adjList(){return adjList;}
//Other functions....
};
我正在尝试访问另一个名为MinPriority.cpp的文件中的adjList数据结构(这些名称并不重要)。整个程序在graph.cpp中工作(我可以构建精细的结构并将其打印在graph.cp中),但我似乎无法使用以下代码从另一个文件(使用完全不同的类)访问adjList:
void MinPriority::referenceVector()
{
Graph graph;
vector< list<Graph::Edge> >& adjList = graph.get_adjList();
cout << "adjList test: " << adjList[0].front().m_vertex << endl;
}
为了简单起见,我们只需将元素Edge("A", 0)
添加到vector< list<Edge> > adjList;
中,这将使列表的Vector在adjList[0].front().m_vertex
处包含字符串A,在adjList[0].front().m_weight
处包含0。然后,我将从文件graph.cpp中打印它,它会告诉我有1个边包含权重0和顶点A。(好!应该这样做!)
真正的问题开始于空MinPriority::referenceVector()
,我一打到vector< list<Graph::Edge> >& adjList = graph.get_adjList();
终端就告诉我:
A将A添加到矢量(A,0)-->异常:eip=0043CE11时的STATUS_ACCESS_VIOLATIONeax=00000000 ebx=00000000 ecx=00000000 edx=00000000 esi=61276EC0 edi=611A1E9Bebp=0028AA68 esp=0028AA50 program=C:\cygwin\home\Ryan \311\P5Dec16\Graph.exe,pid 6188,thread maincs=0023 ds=002B es=002B fs=0053 gs=002B ss=002B堆栈跟踪:框架函数参数0028AA68 0043CE11(000000000028ab08 004026E3)0028AA78 0043头(000000000028abb0028ab7c)0028AB08 004026E3(0028AC20、0028ABB0、20010100、004011C1)0028AC68 00401583(0000000 1,0028AC90,20010100,612757A2)0028ACF8 6100763A(000000000028cd7861006c500000000)堆栈结束跟踪分段故障(核心转储)
这引出了我的问题,vector< list<Graph::Edge> >& adjList = graph.get_adjList();
出了什么问题,我该如何修复它?注意:我试着包含了我认为你们可能需要的尽可能多的信息,如果你还需要什么,请留下评论。
编辑:我再次在GDB中运行它,这次出于某种原因,它给了我更多的信息!我会把它贴在下面!
IN MAINA.将A添加到矢量(A,0)-->程序接收信号SIGSEGV,分段故障。std::list>::begin中的0x0043ce11(这=0x0)位于/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_list.h:600600{返回此->_M_impl._M_node_M_next;}(gdb)其中#std::list>::begin中的0 0x0043ce11(这=0x0)位于/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_list.h:600#std::list>::front中的1 0x0043cead(这=0x0)位于/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_list.h:716#MinPriority::createArray中的2 0x004026e3(this=0x28abe0,targetVertex=0x28ab70)。cpp:59#MSTapp.cpp:39的main()中的3 0x00401583(gdb)
只要构造函数不自动向邻接列表添加边,它就会为空。因此,您正试图访问空图上的边:
void MinPriority::referenceVector()
{
Graph graph; // << empty graph
vector< list<Graph::Edge> >& adjList = graph.get_adjList(); // << empty list
// accessing an empty list vvv will result in access violation
cout << "adjList test: " << adjList[0].front().m_vertex << endl;
}
在访问图表列表之前,您需要先填充图表。此外,在实际访问之前,请检查给定的列表/向量是否包含您想要访问的元素。更有可能的是,您想要对图进行操作,因此类似
void MinPriority::referenceVector(Graph & graph)
{
vector< list<Graph::Edge> >& adjList = graph.get_adjList();
/* ... */
}
可能是你真正想的。