用于自动循环填充矩阵
Posted
技术标签:
【中文标题】用于自动循环填充矩阵【英文标题】:For auto loop to fill a matrix 【发布时间】:2020-08-04 12:50:00 【问题描述】:我想将邻接表转换为邻接矩阵
邻接表如下:
vector< vector< Arc * > * > _adjacences;
类弧有这些:
public:
int sommetArrive; // tops
int longueur; // distance
我有3个向量要填充:
std::vector <int> list[_adjacences.size()]; // vector of tops
std::vector <int> >listD[_adjacences.size()]; // vector of distances
std::vector < vector <int> > matrix( _adjacences.size(),
vector<int>(_adjacences.size(),0 )); // matrix init to 0 and to be filled to become adjacenecy matrix
我是这样填充向量的:
for (unsigned i = 0; i < _adjacences.size(); i++)
for (auto j : *_adjacences[i])
list[i].push_back(j->sommetArrive);
listD[i].push_back(j->longueur);
现在我的问题在这里:我尝试制作邻接矩阵,我能够做到
0 0 0 0 1 0 1
0 1 0 1 0 1 0
....
通过这样做:
for (unsigned i = 0; i < _adjacences.size(); i++)
for (auto j : list[i])
matrix[i][j] = 1;
我想用顶部之间的距离而不是 1 来制作邻接矩阵。
我尝试过这样:
for (unsigned i = 0; i < _adjacences.size(); i++)
for (auto j : list[i])
for (auto k : listD[i]) // MY ERROR IS SOMEWHERE HERE
matrix[i][j] = k; // IN THIS LOOP
我最终在同一行中得到相同的距离
0 0 0 0 35 0 35
0 22 0 22 0 22 0
如何修复我的循环?
【问题讨论】:
如果我正常声明,我会得到:error: request for member ‘push_back’ in ‘list.std::vector<int>::operator[](((std::vector<int>::size_type)i))’, which is of non-class type ‘__gnu_cxx::__alloc_traits<std::allocator<int>, int>::value_type’ aka ‘int’
您希望list
成为什么?是一维还是二维?目前你有一个向量数组,这有点奇怪。而且也不是合法的 C++,因为可变长度数组不是合法的 C++。
你真的应该考虑重做:vector< vector< Arc > > _adjacences
。更理智。
list
是来自 _adjacences 的邻接列表,它是一个指针向量,我试图使 list
成为一个具有整数的向量
必须同意,向量、指针和数组的混合确实令人困惑。现在我可以看到 Arc 类的一些内容,我认为根本不需要任何指针。
【参考方案1】:
所以我认为list
和listD
是一个错误,因为您将应该保持在一起的信息分开。相反,您应该直接从_adjacences
构造matrix
。像这样
vector< vector< Arc * > * > _adjacences = ...;
std::vector<vector<int>> matrix(_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;
如果您想要 list
和 listD
以及 matrix
,那么您可以像现在一样填充它们。
【讨论】:
非常感谢兄弟,我总是犯错把东西分开然后再放回去,因为我发现它更容易思考,也更容易制作。它有效以上是关于用于自动循环填充矩阵的主要内容,如果未能解决你的问题,请参考以下文章