簡體   English   中英

C ++崩潰:嵌套向量上的push_back

[英]C++ crashing:push_back on nested vectors

#include <iostream>
#include <vector>

using namespace std;

struct Neighbor
{
    int index;
    int weight;
    Neighbor(int, int);
};

Neighbor::Neighbor(int index, int weight)
{
    Neighbor::index = index;
    Neighbor::weight = weight;
}

void addEdge(vector<vector<Neighbor> > &graph, int v1, int v2, int weight)
{
    graph[v1].push_back(Neighbor(v2, weight));
    graph[v2].push_back(Neighbor(v1, weight));
}

int main()
{
    vector<vector<Neighbor> > graph;
    vector<vector<Neighbor> > graphIterator;
    graph[0].push_back(Neighbor(1, 5));
    graph[0].push_back(Neighbor(3, 3));
    graph[0].push_back(Neighbor(4, 2.5));

    graph[1].push_back(Neighbor(0, 5));
    graph[1].push_back(Neighbor(2, 3));

    graph[2].push_back(Neighbor(1, 3));
    graph[2].push_back(Neighbor(4, 2.5));
    graph[2].push_back(Neighbor(3, 5));

    graph[3].push_back(Neighbor(0, 3));
    graph[3].push_back(Neighbor(2, 5));
    graph[3].push_back(Neighbor(4, 2.5));

    graph[4].push_back(Neighbor(0, 2.5));
    graph[4].push_back(Neighbor(2, 2.5));
    graph[4].push_back(Neighbor(3, 2.5));

    return 0;
}

上面是我的代碼,運行時似乎崩潰了。 盡管聲明矢量圖似乎很好,但是即使我包含了我的第一個push_back語句,程序也會崩潰。 有人可以建議我嗎?

graph[0].push_back(Neighbor(1, 5)); graph仍然為空,沒有元素,並且graph[0]導致UB。

您應該首先添加元素,例如:

graph.push_back(vector<Neighbor>()); // add one element
...

要么

vector<vector<Neighbor> > graph(5); // construct vector with 5 elements

要么

vector<vector<Neighbor> > graph;
graph.resize(5);                    // resize vector to contain 5 elements.

這里

vector<vector<Neighbor> > graph;
/*...*/
graph[0].push_back(Neighbor(1, 5));

您正在訪問尚未創建的graph[0] 如果您為vector<Neighbor>創建一個typedef ,則可以最好地看到。

typedef vector<Neighbor> NeighborVec;
vector<NeighborVec> graph;
NeighborVec& firstVec = graph[0];

您可以清楚地看到,盡管graph已初始化,但是graph[0]尚未初始化。 您需要執行以下操作:

typedef vector<Neighbor> NeighborVec;
vector<NeighborVec> graph;
graph.push_back(NeighborVec());
NeighborVec& firstVec = graph[0];
firstVec.push_back(Neighbor(1, 5));

tl; dr:

您忘記初始化嵌套向量的第一級。

graph創建為空,然后嘗試訪問不存在的graph[0] ,… graph[4]

您可以最初將其聲明為vector<vector<Neighbor> > graph(5); 這樣就初始化為包含Neighbor的5個空向量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM