用于自动循环填充矩阵

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&lt;int&gt;::operator[](((std::vector&lt;int&gt;::size_type)i))’, which is of non-class type ‘__gnu_cxx::__alloc_traits&lt;std::allocator&lt;int&gt;, int&gt;::value_type’ aka ‘int’ 您希望list 成为什么?是一维还是二维?目前你有一个向量数组,这有点奇怪。而且也不是合法的 C++,因为可变长度数组不是合法的 C++。 你真的应该考虑重做:vector&lt; vector&lt; Arc &gt; &gt; _adjacences。更理智。 list 是来自 _adjacences 的邻接列表,它是一个指针向量,我试图使 list 成为一个具有整数的向量 必须同意,向量、指针和数组的混合确实令人困惑。现在我可以看到 Arc 类的一些内容,我认为根本不需要任何指针。 【参考方案1】:

所以我认为listlistD 是一个错误,因为您将应该保持在一起的信息分开。相反,您应该直接从_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;
    

如果您想要 listlistD 以及 matrix,那么您可以像现在一样填充它们。

【讨论】:

非常感谢兄弟,我总是犯错把东西分开然后再放回去,因为我发现它更容易思考,也更容易制作。它有效

以上是关于用于自动循环填充矩阵的主要内容,如果未能解决你的问题,请参考以下文章

通过计算生成的数字填充数组/矩阵

LA 3704细胞自动机——循环矩阵&&矩阵快速幂

Chrome 自动填充功能不适用于特定页面

sqPaymentForm 不适用于 IOS 自动填充

Datagrid列自动填充不适用于自动生成的列

信用卡自动填充不适用于 React