使用列表和向量工作的不可预测的停止程序
Posted
技术标签:
【中文标题】使用列表和向量工作的不可预测的停止程序【英文标题】:Unpredictable stop program woking with list and vectors 【发布时间】:2013-11-03 22:23:44 【问题描述】:问题记录在代码中,看看他。我尝试 push_back 一个边缘,但它没有被插入。也许我应该初始化列表,但我已经在构造函数中完成了,没有任何改变
这是我尝试将边缘添加到邻接列表的函数:
void Graph::addEdge(int vertex1, int vertex2)
if(!adjacent(vertex1, vertex2)) // if there isn't yet a Edge
adjacency_list[vertex1].push_back(Edge(vertex2, 1)); // add this edge without weight
std::cout << Edge(vertex2, 1) << std::endl; // THE OBJECT EDJE IS PROPERLY CREATED
std::cout << adjacency_list[vertex1].size() << std::endl; // THE SIZE IS EVERYTIME 0
printlist(adjacency_list[vertex1]); // THIS FUNCTION PRINTS JUST end, IN THE LIST THERE IS NOTHING
这里是graph的构造函数,这里有邻接表变量和他的初始化
class Graph
public:
//Graph constructor that takes as parameter the number of vertices in the Graph
Graph(int NumberOfVertices):vertices(NumberOfVertices),
edges(0),
adjacency_list(NumberOfVertices)
for(int x = 0; x < numberOfVertices; x++) adjacency_list[x] = std::list<Edge>();
;
~Graph() adjacency_list.clear();
int V() const return vertices;
int E() const return edges;
Edge returnEdge(std::list<Edge> list, const int vertex2);
bool adjacent (int vertex1, int vertex2);
std::list<Edge> neighbors(int vertex1) const;
void addEdge(int vertex1, int vertex2);
Edge *deleteFromList(Edge *list, const int vertex2);
void deleteEdge(int vertex1, int vertex2);
int getEdgeWeight(int vertex1, int vertex2);
void setEdgeWeight(int vertex1, int vertex2, int weight);
int incrementEdges() edges++; //increment by 1 the number of edges
private: int vertices, //number of vertices
edges; //number of edges
std::vector<std::list<Edge> > adjacency_list; //adjacency_list: every element of index x the vector is a list of edges from x
;
我想知道是否应该初始化adjacency_list
向量中的每个列表,但我不知道该怎么做。我该如何解决这个问题?
【问题讨论】:
可能是无效索引问题。尝试在代码中使用adjacency_list.at(vertex1)
以查看是否引发错误。附带说明一下,您的构造函数中的代码(for
循环)是无用的(一旦您键入 adjacency_list(NumberOfVertices)
,就会隐式创建空列表)。
如果我在程序中使用继续到最后,但函数在该行停止,输出调试不显示
【参考方案1】:
adjacency_list[vertex1].push_back(Edge(vertex2, 1));
行中可能存在超出范围的问题,即如果请求的索引超出范围,operator[]
不会发出信号。要解决此问题,您可以
-
通过
adjacency_list.max_size()
方法检查adjacency_list
向量的最大索引,然后在必要时使用adjacency_list.resize()
或 调整向量的大小
使用adjacency_list.at()
索引向量,但检查out-of-range
异常。
出于性能原因,最方便的是在开始时构建足够大的向量。
另一种方法是使用map<list<Edge> >
(或unordered_map)而不是vector
。
【讨论】:
如果我在程序中使用继续到最后,但函数在该行停止,输出调试不显示以上是关于使用列表和向量工作的不可预测的停止程序的主要内容,如果未能解决你的问题,请参考以下文章
SVM时序预测基于matlab粒子群算法优化支持向量机PSO-SVM期贷时序数据预测含Matlab源码 2289期