int a[100][100]; //globally declared array
int main()
{
while(testcases--)
{
a[100][100]={0};
//rest of code
}
return 0;
}
此代码仅适用于第一个测试用例。对于下一个测试用例,它不会将元素设置为零。
我无法运行循环来运行循环并迭代所有元素。 我想在O(1)中执行此任务。有可能吗?
答案 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);
你无法在运行时为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);
每次迭代,但它可能不值得。