尝试将向量填充为实例变量时出现分段错误

Segmentation fault when trying to fill a vector as instance variable

我想在我的 .hpp 文件中创建一个填充矩阵作为实例变量,但最终出现段错误。

我有一个石墨 class。 在我的 .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.

我实现了 Floyd 算法,这里一切正常 我打印了矩阵来检查它,一切都很好。

结果矩阵 matrixshortPath 我想作为实例变量

我试过如下 这会导致 SEG 错误 为什么?

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

我一启动程序,我就从那个新添加的程序中遇到段错误

弧度如下:

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

不是你问的是这个代码

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; 

您不必编写循环来复制向量,整个向量可以在单个赋值中复制。

我怀疑这甚至可以解决您的问题。如果是这样,那么最初的问题可能是 shortPathmatrix 向量的大小为零,因此循环代码正在分配给不存在的向量元素。当您使用单个赋值复制向量时,您要复制到的向量的大小会更改以匹配您要从中复制的向量的大小。