C ++向量下标超出范围仅与非空向量

时间:2013-04-24 15:55:42

标签: c++

在下面提到的代码的“插入”函数中,我得到了错误向量下标超出范围“:

// this acts as the vertex of graph
typedef struct node
{
    string name;    // stores the unique name of the vertex
    int value;      // stores the integer data saved in the vertex
} node;

class graph
{
private:
    // 2D vector to store the adjencey list of the graph
    vector< vector<node> > adjList;

public:
    graph()
    {
        adjList.resize(0);
    }

    // function to insert a vertex in graph.
    //  'nName' : unique name of vertex;
    //  'nValue': int data stored in vertex;
    //  'neighbours': string vector containing names of all neighbours
    void insert(string nName, int nValue, vector<string> neighbours)
    {
        int i= adjList.size();
        adjList.resize(i + 1);
        adjList[i].resize( neighbours.size() + 1);

        adjList[i][0].name = nName;
        adjList[i][0].value = nValue;

        string temp;
        for(int nTrav=0, lTrav=1, size=neighbours.size(); nTrav<size; ++nTrav, ++lTrav)
        {
            temp=neighbours[nTrav];

            int j=0;
            for(; j<adjList.size() || adjList[j][0].name != temp; ++j);

            if(j==adjList.size())
            {
                cout << "\nName not present. Element not inserted";
                return;
            }

            adjList[i][lTrav].name = adjList[j][0].name;
            adjList[i][lTrav].value = adjList[j][0].value;

        }
    }
};

当传递的字符串向量'neighbor'为空时,代码正常工作,但是当向量有一些元素时,它会给出指定的错误。

操作系统:Windows 8 IDE:Visual Studio 2013

1 个答案:

答案 0 :(得分:2)

除了Joachim对vector.push_back(...)的评论之外,您应该将第二个循环更改为:

for(; j<adjList.size() && adjList[j][0].name != temp; ++j)

用AND替换OR。在评估其内容之前,您必须确保满足j<adjList.size()条件。否则,由于延迟评估,您实际上只会在adjList[j][0].name != temp返回false时评估j<adjList.size()。这就是,当你已经出界时。