J'essayais d'utiliser auto &
dans la boucle à distance pour modifier la valeur. Mais j'étais tellement choqué que ça ne marchait pas "TOUT LE TEMPS". Je joins mon code original ci-dessous. Il trouve simplement l'élément 0 dans une matrice et définit la ligne et la colonne correspondantes sur tous les zéros.Auto et dans la boucle de C++ 11 ne fonctionnait pas
#include<iostream>
#include<vector>
using namespace std;
void zerolify(vector<vector<int>>& m)
{
int row=m.size();
int col=col>0?m[0].size():0;
vector<int> r(row,0);
vector<int> c(col,0);
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
if(m[i][j]==0)
{
r[i]=1;
c[j]=1;
}
}
}
for(int i=0;i<row;i++)
{
if(r[i])
{
//cout<<"row: "<<i<<endl;
for(auto &e : m[i])
{
e=0;
}
//for(int j=0;j<col;j++)
//{
// m[i][j]=0;
//}
}
}
for(int i=0;i<col;i++)
{
if(c[i])
{
for(int j=0;j<row;j++)
{
m[j][i]=0;
}
}
}
}
void printMatrix(vector<vector<int>> m)
{
for(auto i:m)
{
for(auto j:i)
{
cout<<j<<" ";
}
cout<<endl;
}
}
int main(int argn, char** argv)
{
vector<vector<int>> m(5,vector<int>(5));
m[0]={1,2,3,0,4};
m[1]={1,1,3,5,4};
m[2]={1,2,3,0,4};
m[3]={1,2,3,5,4};
m[4]={1,2,3,5,4};
cout<<"Original matrix:"<<endl;
printMatrix(m);
zerolify(m);
cout<<"Zerolify"<<endl;
printMatrix(m);
return 0;
}
J'utilise Mac OS 10.12.2 avec la version d'Apple LLVM 8.0.0 du compilateur (clang-800.0.42.1). Voici mes résultats: My command line output
Vous pouvez voir que la première fois que cela n'a pas fonctionné, laissant la matrice inchangée. La deuxième fois ça a marché. J'ai aussi essayé auto &&
, ça m'a donné le même comportement "incertain". Mais pour la boucle avec indexation directe fonctionne tout le temps (commentée dans le code). Actuellement, je ne pouvais pas reproduire le problème dans tous les autres cas, cependant la logique ici est déjà assez simple.
Pourrait-il être un problème de compilation? Quelqu'un peut-il exécuter le code et voir si le problème peut être reproduit?
Belle prise, erreur stupide, merci! – tengi