特定线路上的段故障,无法弄清楚原因

时间:2013-12-19 19:10:44

标签: list vector segmentation-fault

程序seg一旦到达这行代码就会出错(代码在函数set_array中的Graph.cpp中。)

adjList[adjList.size()].push_back(Edge(vertex, 0));

基本上,我希望每当我需要使向量更长以适应更多链接列表时调用此行,因为结构是链接列表的向量。这是.h文件,它声明链接列表的向量及其内容。每个节点都包含一个顶点和一个权重。 (节点类称为class Edge。)

#ifndef GRAPH_H_INCLUDED
#define GRAPH_H_INCLUDED
//class MinPriority;
#include <iostream>
#include <string>
#include <vector>
#include <list>
using namespace std;
class Graph
{
public:
    Graph();
    ~Graph();
    void set_Edge(string targetVertex, string vertex, int weight);
    void set_array(string vertex);
    void print_Test();
    friend class MinPriority;
private:
    class Edge
    {
    public:
        Edge(string vertex, int weight)
        {m_vertex = vertex; m_weight = weight;}
        ~Edge(){}

        string m_vertex;
        int m_weight;
    };

    vector< list<Edge> > adjList; //declaration of the array of linked lists

};


#endif // GRAPH_H_INCLUDED

这是我想要adjList[adjList.size()].push_back(Edge(vertex, 0));做的事情;基本上每当我想在图表中插入一个新的顶点时,我都会这样称呼它。一旦我尝试将第一个项目放在树中,它就会出现故障。我要求插入'A',权重为'0',它会立即出现故障。顺便说一句,我正在尝试建立一个邻接列表,我使用adjList[adjList.size()].push_back(Edge(vertex, 0));在图中添加一个新的(未使用的)顶点。让我们假装将其传递给函数...

A B C D

执行此操作后,向量的长度应增加4.但当然它会在该行处出现故障(它在GDB中告诉我)。我很擅长使用像这样的奇怪的数据结构,所以任何帮助都会非常感激。

2 个答案:

答案 0 :(得分:0)

尝试转换数组索引:

adjList[int(adjList.size())]

或尝试使用0?

编辑:在推送Edge元素之前,您似乎必须手动输入列表。

// Creation of independant lists
list<Edge> Eg, Ec;

Edge h("AB", 0);
Edge f("CD", 0);

adjList.push_back(Eg);
adjList[adjList.size()-1].push_back(h);
adjList.push_back(Ec);
adjList[adjList.size()-1].push_back(f);

// Return 2
cout << adjList.size();

我还没有找到另一种方法。但我不是c ++专家。

答案 1 :(得分:0)

尝试

adjList[adjList.size()-1]

数组索引为0 ..(size-1)。

例如,4元素数组的索引是0,1,2和3.

如果阵列可能为空,则可以添加逻辑以防止任何访问 -

if (adjList[adjList.size() > 0) ...