[英]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.