C++ crashing: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.
graph
创建为空,然后您尝试访问不存在的 graph[0]
,... graph[4]
。
您可以最初将其声明为 vector<vector<Neighbor> > graph(5);
,以便它初始化时包含 5 个 Neighbor
的空向量。
这里
vector<vector<Neighbor> > graph;
/*...*/
graph[0].push_back(Neighbor(1, 5));
您正在访问尚未创建的 graph[0]
。如果您创建一个 typedef
到 vector<Neighbor>
.
,则效果最好
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;博士:
您忘记初始化嵌套向量的第一层。
#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.
graph
创建为空,然后您尝试访问不存在的 graph[0]
,... graph[4]
。
您可以最初将其声明为 vector<vector<Neighbor> > graph(5);
,以便它初始化时包含 5 个 Neighbor
的空向量。
这里
vector<vector<Neighbor> > graph;
/*...*/
graph[0].push_back(Neighbor(1, 5));
您正在访问尚未创建的 graph[0]
。如果您创建一个 typedef
到 vector<Neighbor>
.
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;博士:
您忘记初始化嵌套向量的第一层。