[英]Auto & in ranged for loop of C++11 not working
我正在嘗試使用auto &
范圍內的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;
}
我將Mac OS 10.12.2與Apple LLVM版本8.0.0(clang-800.0.42.1)編譯器一起使用。 這是我的結果: 我的命令行輸出
您會看到它第一次無法工作時,矩陣保持不變。 第二次工作。 我還嘗試了auto &&
,它給了我同樣的“不確定”行為。 但是for循環一直帶有直接索引工作(在代碼中已注釋)。 目前,我無法在其他任何情況下重復該問題,但是這里的邏輯已經足夠簡單了。
可能是編譯器問題嗎? 任何人都可以運行該代碼,看看是否可以復制該問題?
auto
是無罪的。
以下初始化(在zerolify()
)是錯誤的(未定義的行為)
int col=col>0?m[0].size():0;
因為您使用col
的值初始化col
。
不知道您想要什么,但我想正確的初始化是
int col { row > 0 ? m[0].size() : 0 };
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.