如何分配一个二维向量?
How to allocate a 2D vector?
我在一个问题中使用了 dfs
,但直到现在我还没有在主程序中调用 dfs
,我的程序崩溃了。最近我在 c
编程,现在我切换到 cpp
。所以我是 cpp
.
的新手
我知道我在向量中哪里做错了请告诉我有什么可以改进的。
我知道矢量可以自动增加那里的大小。
#include<iostream>
#include<vector>
using namespace std;
const int MAX = 100000;
bool visited[MAX] = { 0 };
int intime[MAX];
int outtime[MAX];
int timer = 0;
void dfs(vector<vector<int>> graph, int v)
{
visited[v] = true;
timer++;
intime[v] = timer;
vector<int>::iterator it = graph[v].begin();
while (it != graph[v].end()) {
if (visited[*it] == false)
{
dfs(graph, *it);
}
it++;
}
++timer;
outtime[v] = timer;
}
int main()
{
vector<vector<int>> graph;
graph[1].push_back(2);
graph[1].push_back(3);
graph[3].push_back(6);
graph[2].push_back(4);
graph[2].push_back(5);
graph[5].push_back(7);
graph[5].push_back(8);
graph[5].push_back(9);
system("pause");
}
您的程序因访问未分配的内存而崩溃。正确的做法是
std::vector<std::vector<int>> graph(5); // allocates 5 rows of vector of vectors
^^^^
其次,在 C++ 中数组索引从 0
开始到 n-1
。因此你需要
graph[0].push_back(2); // element at (0,0)
graph[0].push_back(3); // element at (0,1)
graph[1].push_back(6); // element at (1,0)
graph[1].push_back(4); // element at (1,1)
....
或者,您可以使用 aggregate initialization.
直接初始化向量 的 向量
std::vector<std::vector<int>> graph
{
{2, 3}, // first row of vector
{4, 5}, // second row of vector
{6}, // third row of vector
{7, 8, 9} // forth row of vector
};
或emplace每行向量到向量中的向量。
using Row = std::vector<int>;
std::vector<Row> graph;
graph.emplace_back(Row{ 2, 3 });
graph.emplace_back(Row{ 4, 5 });
graph.emplace_back(Row{ 6 });
graph.emplace_back(Row{7, 8, 9});
向量的大小在您声明它的方式中为零。
您可以做的是声明具有大小的向量。
int v = 10;
std::vector<std::vector<int>>graph(v);
graph[1].push_back(2);
这会起作用。
我在一个问题中使用了 dfs
,但直到现在我还没有在主程序中调用 dfs
,我的程序崩溃了。最近我在 c
编程,现在我切换到 cpp
。所以我是 cpp
.
我知道我在向量中哪里做错了请告诉我有什么可以改进的。 我知道矢量可以自动增加那里的大小。
#include<iostream>
#include<vector>
using namespace std;
const int MAX = 100000;
bool visited[MAX] = { 0 };
int intime[MAX];
int outtime[MAX];
int timer = 0;
void dfs(vector<vector<int>> graph, int v)
{
visited[v] = true;
timer++;
intime[v] = timer;
vector<int>::iterator it = graph[v].begin();
while (it != graph[v].end()) {
if (visited[*it] == false)
{
dfs(graph, *it);
}
it++;
}
++timer;
outtime[v] = timer;
}
int main()
{
vector<vector<int>> graph;
graph[1].push_back(2);
graph[1].push_back(3);
graph[3].push_back(6);
graph[2].push_back(4);
graph[2].push_back(5);
graph[5].push_back(7);
graph[5].push_back(8);
graph[5].push_back(9);
system("pause");
}
您的程序因访问未分配的内存而崩溃。正确的做法是
std::vector<std::vector<int>> graph(5); // allocates 5 rows of vector of vectors
^^^^
其次,在 C++ 中数组索引从 0
开始到 n-1
。因此你需要
graph[0].push_back(2); // element at (0,0)
graph[0].push_back(3); // element at (0,1)
graph[1].push_back(6); // element at (1,0)
graph[1].push_back(4); // element at (1,1)
....
或者,您可以使用 aggregate initialization.
直接初始化向量 的 向量std::vector<std::vector<int>> graph
{
{2, 3}, // first row of vector
{4, 5}, // second row of vector
{6}, // third row of vector
{7, 8, 9} // forth row of vector
};
或emplace每行向量到向量中的向量。
using Row = std::vector<int>;
std::vector<Row> graph;
graph.emplace_back(Row{ 2, 3 });
graph.emplace_back(Row{ 4, 5 });
graph.emplace_back(Row{ 6 });
graph.emplace_back(Row{7, 8, 9});
向量的大小在您声明它的方式中为零。
您可以做的是声明具有大小的向量。
int v = 10;
std::vector<std::vector<int>>graph(v);
graph[1].push_back(2);
这会起作用。