使用列表和向量工作的不可预测的停止程序

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&lt;list&lt;Edge&gt; &gt;(或unordered_map)而不是vector

【讨论】:

如果我在程序中使用继续到最后,但函数在该行停止,输出调试不显示

以上是关于使用列表和向量工作的不可预测的停止程序的主要内容,如果未能解决你的问题,请参考以下文章

C++ 向量和列表插入

列表视图项目的不可预测的行为复选框单击

SVM时序预测基于matlab粒子群算法优化支持向量机PSO-SVM期贷时序数据预测含Matlab源码 2289期

SVM时序预测基于matlab粒子群算法优化支持向量机PSO-SVM期贷时序数据预测含Matlab源码 2289期

当为文本文件交换字符串列表时,程序停止工作

如何在 C++ 中使用向量对的向量制作邻接表?