2017-03-07 1 views
-1

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?

Répondre

5

auto est non coupable.

L'initialisation suivante (en zerolify()) est erroné (comportement non défini)

int col=col>0?m[0].size():0; 

parce que vous initialisez col en utilisant la valeur de col.

Je ne sais pas à comprendre ce que vous voulez, mais je suppose que l'initialisation correcte est

int col { row > 0 ? m[0].size() : 0 }; 
+0

Belle prise, erreur stupide, merci! – tengi