尝试将向量填充为实例变量时出现分段错误
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 算法,这里一切正常
我打印了矩阵来检查它,一切都很好。
结果矩阵 matrix
和 shortPath
我想作为实例变量
我试过如下 这会导致 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;
您不必编写循环来复制向量,整个向量可以在单个赋值中复制。
我怀疑这甚至可以解决您的问题。如果是这样,那么最初的问题可能是 shortPath
和 matrix
向量的大小为零,因此循环代码正在分配给不存在的向量元素。当您使用单个赋值复制向量时,您要复制到的向量的大小会更改以匹配您要从中复制的向量的大小。
我想在我的 .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 算法,这里一切正常 我打印了矩阵来检查它,一切都很好。
结果矩阵 matrix
和 shortPath
我想作为实例变量
我试过如下 这会导致 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;
您不必编写循环来复制向量,整个向量可以在单个赋值中复制。
我怀疑这甚至可以解决您的问题。如果是这样,那么最初的问题可能是 shortPath
和 matrix
向量的大小为零,因此循环代码正在分配给不存在的向量元素。当您使用单个赋值复制向量时,您要复制到的向量的大小会更改以匹配您要从中复制的向量的大小。