Ошибка сегментации при попытке заполнить вектор как переменную экземпляра - PullRequest
0 голосов
/ 04 августа 2020

Я хочу сделать заполненную матрицу в качестве переменной экземпляра в моем .hpp файле, но в итоге получаю ошибку seg.

У меня есть класс graphe. В моем файле. cpp я заполнил матрицу смежности следующим образом:

void Graphe::shortRoute( void ){
    std::vector<vector<int>> matrix(_adjacences.size(), vector<int>(_adjacences.size()));
    std::vector<vector<int>> shortPath(_adjacences.size(), vector<int>(_adjacences.size()));
    
    for (unsigned i = 0; i < _adjacences.size(); i++) {
                for (auto j : *_adjacences[i]) {
                        matrix[i][j->sommetArrive] = j->longueur;
                }
        } 
... more and more code to get a filled shortPath matrix.

Я реализовал алгоритм Флойда, и здесь все работает отлично, и я распечатал матрицу, чтобы проверить это, все в порядке.

полученные матрицы matrix и shortPath Я хотел сделать в качестве переменных экземпляра

Я пробовал следующее ЭТО ПРИЧИНА ОШИБКА СЕГМЕНТА ПОЧЕМУ?

for ( unsigned i = 0; i < _adjacences.size(); i++)
    for (unsigned j = 0; j < _adjacences.size(); j++){
         shortPath[i][j] = SP[i][j];
         matrix[i][j] = M[i][j];
    }

и в моем файле .hpp я объявил SP и M следующим образом:

class Graphe
{
private:
    vector< vector< Arc * > * > _adjacences;
    std::vector<vector<int>> M;
    std::vector<vector<int>> SP;
....

как только я запускаю программу, я получаю ошибку seg из этого нового добавления

Ar c is следующим образом:

class Arc
{
public:
    int sommetArrive;
    int longueur;
    string nom;

    Arc( int a_sommetArrive, int a_longueur, string a_nom );
    virtual ~Arc( void );

    friend ostream & operator <<( ostream &, Arc const & );
};

1 Ответ

1 голос
/ 05 августа 2020

Не то, о чем вы спрашиваете, но этот код

for ( unsigned i = 0; i < _adjacences.size(); i++) 
    for (unsigned j = 0; j < _adjacences.size(); j++) { 
        shortPath[i][j] = SP[i][j]; 
        matrix[i][j] = M[i][j]; 
    }

можно упростить до этого

 shortPath = SP; 
 matrix = M; 

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

У меня есть подозрение, что это может даже решить вашу проблему. Если это так, то исходная проблема, вероятно, заключалась в том, что векторы shortPath и matrix имеют нулевой размер, поэтому код l oop присваивается элементам вектора, которые не существуют. Когда вы копируете вектор с помощью одного присваивания, размер копируемого вектора изменяется, чтобы соответствовать размеру вектора, из которого вы копируете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...