自动和范围内 for 循环 C++11 不起作用
Auto & in ranged for loop of C++11 not working
我试图在范围内使用 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;
}
我正在使用Apple LLVM版本8.0.0(Clang-800.0.42.1)编译器的Mac OS 10.12.2。这是我的结果:我的命令行输出
您可以看到它第一次没有工作,使矩阵没有变化。第二次起作用。我还尝试了auto &&
,它给了我同样的"不确定"行为。但是,对于循环,始终使用直接索引工作(在代码中评论)。目前,在任何其他情况下,我都无法复制问题,但是这里的逻辑已经足够简单了。
可能是编译器问题吗?谁能运行代码,看看问题是否可以复制?
auto
不合格。
以下初始化(在zerolify()
中)是错误的(未定义的行为)
int col=col>0?m[0].size():0;
因为您使用col
的值初始化col
。
不确定您想要什么,但我认为正确的初始化是
int col { row > 0 ? m[0].size() : 0 };
相关文章:
- C++11 基于范围的 for 循环,用于 std::list
- C++11:没有复制构造函数的自定义基于范围的循环
- 当程序预期根据用户输入再次循环时,它会导致分段错误:11
- 如何在Visual Studio(C++11)中处理相互依赖/循环依赖
- 如何使用 c++11 语法创建 for 循环以遍历向量
- 自动和范围内 for 循环 C++11 不起作用
- 我写了一个函数来删除循环链接列表中的第 1 个节点,但输出显示无限次"55 44 33 22 11 99",那么我该如何解决呢?
- C++ for 循环中的 11 个线程类成员函数会给出分段错误
- 声明中的循环依赖性C 11
- C 的性能11现代风格的循环与老式循环
- 当遇到很长的循环时,会出现分段错误:11 或内存分配错误
- 内存分配,用于在C 11中循环中函数的返回值:如何优化
- 基于范围的循环:自动更改C 11中的含义
- GCC 4.4 不实现 C++11 范围循环.它还支持哪些其他范围循环语法
- for 循环中的常量指针 (C++ 11)
- 如何将基于迭代器的 for 循环重写为基于范围的循环 (C++11)
- 用于循环的c++(c++11方式和旧版本方式)
- 从优化端基于范围的循环 C++11
- 使用对指针的引用作为循环C++11范围内的序列
- 针对范围(L,R)的基于范围的循环C++11