将2-D数组的所有元素设置为零

时间:2017-02-12 13:43:28

标签: c++ arrays c++14

int a[100][100]; //globally declared array
int main()
{
    while(testcases--)
    {
        a[100][100]={0};
        //rest of code
    }
    return 0;
}

此代码仅适用于第一个测试用例。对于下一个测试用例,它不会将元素设置为零。

我无法运行循环来运行循环并迭代所有元素。 我想在O(1)中执行此任务。有可能吗?

3 个答案:

答案 0 :(得分:1)

您在运行之间使用相同的数组,并且希望将其重置为零。您无法避免迭代所有单元格并将它们设置为零。 即使在去除时初始化为零,也没有有希望的O(1)。编译器初始化的方式取决于编译器。

答案 1 :(得分:1)

首先,您似乎对术语有轻微的误解。

这是初始化:

int a = b;

这是一项任务:

int a;
a = b;

您可以使用以下代码将数组初始化为零:

int array[10][20] = {0};

或者:

int array[10][20] = {};

或者:

int array[10][20] {};

请记住,默认情况下全局(和static)数组是零初始化的。

在创建数组后,可以使用零填充数组:

for (int i = 0; i < size; i++)
    for (int j = 0; j < size; j++)
        array[i][j] = 0;

或者:

for (int (&a)[100] : array) // or  for (auto &a : array)
    for (int &b : a) // or  for (auto &b : a)
        b = 0;

或者:

std::memset(array, 0, sizeof array);

P.S。

无法在运行时为O(1)填充一个零数字。

答案 2 :(得分:0)

你的数组是零初始化的&#34;对于第一个测试用例&#34;只是因为它是用静态存储持续时间声明的。这种具有静态存储持续时间的数组的生命开始为零初始化。

你的

a[100][100]={0};

行没有任何关系。这实际上仅仅是a[100][100] = 0,它将单个0写入数组的不存在(越界)元素。 (行为未定义)。

如果您想在每次迭代时使用零重新初始化数组,则必须手动或使用库级解决方案,因为没有核心语言级别的功能可以为您完成。在你的情况下(一个整数数组),你甚至可以使用老式的

std::memset(a, 0, sizeof a);

你也可以使用聪明但效率低下的东西,比如

decltype(a) zeros{};
std::swap(a, zeros);

每次迭代,但它可能不值得。