ten*_*ngi -1 c++ auto c++11 ranged-loops
我试图auto &在ranged for循环中使用来修改值.但是我感到非常震惊,以至于它"无所不及".我附上下面的原始代码.它只是在矩阵中找到元素0,并将相应的行和列设置为全零.
#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;
}
Run Code Online (Sandbox Code Playgroud)
我使用的是Mac OS 10.12.2和Apple LLVM 8.0.0版(clang-800.0.42.1)编译器.这是我的结果: 我的命令行输出
您可以看到它第一次不起作用而保持矩阵不变.第二次工作.我也尝试过auto &&,它给了我同样的"不确定"行为.但是对于具有直接索引的循环一直工作(在代码中注释掉).目前,我无法在任何其他情况下复制该问题,但这里的逻辑已经足够简单了.
可能是编译问题?任何人都可以运行代码,看看问题是否可以复制?
auto 是无罪的.
以下初始化(in zerolify())错误(未定义的行为)
int col=col>0?m[0].size():0;
Run Code Online (Sandbox Code Playgroud)
因为你col使用的值初始化col.
不确定你想要什么,但我想正确的初始化是
int col { row > 0 ? m[0].size() : 0 };
Run Code Online (Sandbox Code Playgroud)