簡體   English   中英

自動和范圍內的C ++ 11循環不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM