问题:我正在尝试初始化一个二维二维数组,并找到其对角线总和的绝对差。我为此编写了以下代码。
#include<vector>
#include<iostream>
using namespace std;
vector<vector<int>> init() // function to initialize the array
{
int size;
cin>>size;
vector<vector<int>> vector(size);
for(int i = 0; i < size; ++i)
{
vector[i].resize(size);
for(int j = 0; j < size; ++j)
{
cin>>vector[i][j];
}
}
return vector;
}
int diagonal_diff(vector<vector<int>> vector)// function to find difference
{
int diff;
auto sum_1 = 0;
auto size = vector.size();
for(auto i = 0; i < size; ++i)
{
auto j = i;
sum_1 = vector[i][j] + sum_1;
}
int sum_2 = 0;
for(auto i = size -1; i >= 0; --i)
{
auto j = (size-1) - i;
sum_2 = vector[i][j] + sum_2;
}
diff = sum_1 - sum_2;
diff = (diff >= 0)? diff:diff*(-1);
return diff;
}
int main()
{
auto vector = init();//initialising array
for(auto i = 0; i < vector.size(); ++i)//printing the array
{
for(auto j = 0; j < vector.size(); ++j )
{
cout<< vector[i][j];
}
}
auto temp = diagonal_diff(vector);// calling difference function
cout<<temp<<endl;
return 0;
}
,但是在打印阵列后给出分段错误。无法找出原因。
我正在尝试从hackerRank解决此problem。如果我注释掉调用对角线diff()函数的行,则代码可以正常运行。因此,我认为错误在于对角线diff()函数。
答案 0 :(得分:0)
在diagonal_diff
内,您有以下循环:
int sum_2 = 0;
for (auto i = size - 1; i >= 0; --i)
{
auto j = (size-1) - i;
sum_2 = vector[i][j] + sum_2;
}
问题在于size
的声明看起来像这样:
auto size = vector.size();
vector.size()
返回一个size_t
对象类型,这意味着没有负值。
再次查看循环,然后查看i
声明:
auto i = size - 1
由于size
是size_t
类型,因此您的i
也将自动size_t
。现在,循环的停止条件为:i >= 0
,这意味着在true
为i
的情况下始终为size_t
。当i
等于0,并且您到达第三循环的部分:--i
时,它得到的最大值是-1
,而不是得到size_t
。然后,您正打算去做:sum_2 = vector[i][j] + sum_2;
并得到一个例外。
要解决此问题,您要做的就是将i
声明更改为:int i = size - 1
。
注意:强烈建议不要使用vector
作为名称,尤其是当您在代码内部使用using namespace std;
时。 vector
是一个类名,它可能导致代码冲突。您可以使用vec
作为名称。