値を変更するためにranged forループにauto &
を使用しようとしていました。しかし、私はそれが "すべての時"に動作しなかったので、とてもショックを受けました。私は元のコードを以下に添付します。これは、行列の要素0を見つけて、対応する行と列をすべて0に設定するだけです。C++ 11の自動ループ&ループが動作しない
#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;
}
私は、Apple LLVMのバージョン8.0.0(打ち鳴らす-800.0.42.1)コンパイラを搭載したMac OS 10.12.2を使用しています。ここに私の結果があります: My command line output
最初に動作しなかったことが分かります。それが二度目に働いた。私もauto &&
を試しました、それは私に同じ「不確実な」振る舞いを与えました。しかし、直接索引付けを行うループでは、常に(コード内でコメントアウトされています)。現在のところ、他のケースでは問題を再現することはできませんでしたが、ここでのロジックはすでに単純です。
コンパイラに問題はありますか?誰でもコードを実行して、問題を複製できるかどうか確認できますか?
あると思いますかを理解してわかりません! – tengi