Как добавить столбец и строку в конце 2d массива? - PullRequest
0 голосов
/ 01 мая 2019

Я хочу добавить строку и столбец в конец моего 2D-массива при каждом вызове функции.

template <typename vertex> void directed_graph<vertex>::add_vertex(const vertex& u) 
{
    if (!directed_graph<vertex>::contains(u))
    {
        vertices.push_back(u);
        for (unsigned i = 0; i < vertices.size()-1; i ++)
            {
                adj_matrix[i].resize(vertices.size());
                adj_matrix[i][vertices.size()-1] = false;
            }

        adj_matrix.resize(vertices.size());
        for (unsigned i = 0; i < vertices.size(); i ++)
        {
            adj_matrix[vertices.size()-1][i] = false;
        }   
    }
}

Я попробовал этот код, как описано выше, и получил SegFault.

1 Ответ

0 голосов
/ 01 мая 2019

Что вы пытаетесь сделать

Вы намереваетесь увеличить матрицу смежности n*n до (n+1)*(n+1), где n равно vertices.size()-1, после вашего начального push_back() в векторе vertices.

Это выглядит (почти) хорошо:

  • Ваш первый for -тип изменяет размеры n существующих внутренних векторов, добавляя де-факто отсутствующий столбец.
  • Затем вы изменяете размер внешнего вектора, который добавляет созданный по умолчанию (пустой) вектор в конце.
  • Затем во втором for -цикле вы пытаетесь инициализировать новый внутренний вектор, непосредственно присваивая значение его элементам.

Что здесь не так?

К сожалению, когда вы делаете этот последний шаг, последний внутренний вектор все еще пуст. Таким образом, ваш второй цикл for использует индекс вне диапазона i, который вызывает UB (возможный симптом: ошибка сегмента).

Как это решить?

Все, что вам нужно сделать, это изменить размер последнего внутреннего вектора перед вторым циклом:

...
adj_matrix.resize(vertices.size());
adj_matrix[vertices.size()-1].resize(vertices.size());  //<<-- this is missing !
for (unsigned i = 0; i < vertices.size(); i ++) 
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...