Как выделить 2D вектор? - PullRequest
0 голосов
/ 27 ноября 2018

Я использую 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");
}

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Размер вектора равен нулю в том виде, в котором вы его объявили.

Что вы можете сделать, это объявить вектор с размером.

int v = 10;
std::vector<std::vector<int>>graph(v);
graph[1].push_back(2);

Это будет работать.

0 голосов
/ 27 ноября 2018

Ваша программа падает из-за доступа к нераспределенной памяти.Правильный путь:

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)
....

В качестве альтернативы, вы можете напрямую инициализировать вектор векторов , используя совокупную инициализацию .

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
};

или вставьте каждой строки вектора в вектор векторов .

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});
...