【问题标题】:Auto & in ranged for loop of C++11 not workingC ++ 11的自动和范围for循环不起作用
【发布时间】:2017-03-07 00:49:09
【问题描述】:

我试图在 ranged for 循环中使用 auto & 来修改值。但我很震惊,它“一直”都不起作用。我在下面附上我的原始代码。它只是在矩阵中找到元素 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) 编译器。这是我的结果: My command line output

您可以看到第一次没有工作,保持矩阵不变。第二次成功了。我也试过auto &amp;&amp;,它给了我同样的“不确定”行为。但是带有直接索引的 for 循环一直都在工作(在代码中注释掉了)。目前,我无法在任何其他情况下复制该问题,但是这里的逻辑已经足够简单了。

可能是编译器问题?任何人都可以运行代码并查看是否可以复制问题吗?

【问题讨论】:

    标签: c++ c++11 auto ranged-loops


    【解决方案1】:

    auto 无罪。

    以下初始化(在zerolify())是错误的(未定义的行为)

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

    因为您使用col 的值初始化col

    不确定你想要什么,但我想正确的初始化是

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-01
      • 2019-04-10
      • 2018-07-13
      • 2021-04-08
      • 2013-07-24
      相关资源
      最近更新 更多