C++ 如何分配二维向量?

C++ 如何分配二维向量?,c++,algorithm,c++11,data-structures,stdvector,C++,Algorithm,C++11,Data Structures,Stdvector,我在一个问题中使用了dfs,但到目前为止,我还没有主要调用dfs,我的程序正在崩溃。最近我在c中编程,现在我切换到cpp。所以我是新来的cpp 我知道我在矢量中犯了什么错误,请告诉我可以改进什么。 我知道向量可以自动增加大小 #include<iostream> #include<vector> using namespace std; const int MAX = 100000; bool visited[MAX] = { 0 }; int intime[MAX];

我在一个问题中使用了
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;
常数int MAX=100000;
布尔访问了[MAX]={0};
intintime[MAX];
int超时[最大值];
int定时器=0;
void dfs(向量图,int v)
{
访问[v]=正确;
定时器++;
intime[v]=计时器;
向量::迭代器it=graph[v].begin();
while(it!=graph[v].end()){
if(已访问[*it]==false)
{
dfs(图,*it);
}
it++;
}
++定时器;
outtime[v]=计时器;
}
int main()
{
矢量图;
图[1]。推回(2);
图[1]。推回(3);
图[3]。推回(6);
图[2]。推回(4);
图[2]。推回(5);
图[5]。推回(7);
图[5]。推回(8);
图[5]。推回(9);
系统(“暂停”);
}

您的程序因访问未分配的内存而崩溃。正确的方法是

std::vector<std::vector<int>> graph(5); // allocates 5 rows of vector of vectors
                                   ^^^^

或者,可以使用直接初始化向量的向量

std::向量图
{
{2,3},//向量的第一行
{4,5},//向量的第二行
{6} ,//向量的第三行
{7,8,9}//向量的第四行
};
或每行向量到向量的向量

使用Row=std::vector;
向量图;
图.向后安放(第{2,3}行);
图{4,5}行的后置位置;
图{6}行的后置位置;
图.向后安放(第7、8、9行);

您的程序因访问未分配的内存而崩溃。正确的方法是

std::vector<std::vector<int>> graph(5); // allocates 5 rows of vector of vectors
                                   ^^^^

或者,可以使用直接初始化向量的向量

std::向量图
{
{2,3},//向量的第一行
{4,5},//向量的第二行
{6} ,//向量的第三行
{7,8,9}//向量的第四行
};
或每行向量到向量的向量

使用Row=std::vector;
向量图;
图.向后安放(第{2,3}行);
图{4,5}行的后置位置;
图{6}行的后置位置;
图.向后安放(第7、8、9行);

按照您声明的方式,向量的大小为零

您可以做的是声明具有大小的向量

int v = 10;
std::vector<std::vector<int>>graph(v);
graph[1].push_back(2);
intv=10;
标准:矢量图(v);
图[1]。推回(2);

这将起作用。

按照您声明的方式,向量的大小为零

您可以做的是声明具有大小的向量

int v = 10;
std::vector<std::vector<int>>graph(v);
graph[1].push_back(2);
intv=10;
标准:矢量图(v);
图[1]。推回(2);

这将起作用。

图形[1]
矢量图形之后是未定义的行为,因为不存在元素访问。我正在声明一个2d向量,它是vector@humblefool您正在声明一个空的2d向量,然后访问不存在的元素。@humblefool“在这里行大小无关紧要,它们可以根据需要展开”仅当使用
推回
放置
,或调整大小
。考虑重新阅读.<代码>图[1 ] < /代码>后的代码>矢量图;<代码>是未定义的行为,因为不存在元素访问。我正在声明一个2d向量,它是vector@humblefool您正在声明一个空的2d向量,然后访问不存在的元素。@humblefool“在这里行大小无关紧要,它们可以根据需要展开”仅当使用
推回
放置
,或调整大小。考虑重新阅读文档。
int v = 10;
std::vector<std::vector<int>>graph(v);
graph[1].push_back(2);