在while循环中重新初始化数组[关闭]

Posted

技术标签:

【中文标题】在while循环中重新初始化数组[关闭]【英文标题】:Reinitialize array in while-loop [closed] 【发布时间】:2014-05-11 14:29:58 【问题描述】:

假设我有以下数组

 char ch[1000];

我初始化这个字符

for (int i = 0; i < 1000; i++) 
   ch[i] = 0;
 

然后我想在while循环中使用这个数组

 bool active = true;
 int i = 0;
 while(active) 


     ch[i] = ....... // fill the array with certain ashii 

     // code 
     strcpy(string, ch); // after this - I may go back to the top of the loop and startover   

     i++;
 

循环实际上看起来并不像这样 - 但这只是示意图。问题就在这里(也是我的问题)——如果我现在想在循环中再次使用这个 char 数组——那就是转到 while 循环的顶部并用新字符填充 char 变量,最好的方法是什么从旧字符中清空数组。

1) 更改代码,以便我在 while 循环中声明此缓冲区

用for循环重新初始化它似乎没有效率,就像我在循环外做的那样

 for (int i = 0; i < 1000; i++) 
   ch[i] = 0;
      

这种方法似乎需要很多 cpu 指令

有没有更好的方法来做到这一点?

【问题讨论】:

你不会“清空一个数组”,你只是重复使用它。此外,如果您只对之后明确覆盖的元素感兴趣,那么将所有元素归零确实没有意义。这只需要时间和代码。 while 循环中的i 是什么? 如果你说char ch[1000] = ;,你已经得到了一个零初始化的数组。不需要循环。 @anders:AFAICT,它是关于出于某种目的使用 char 数组,并且您(重新)初始化它,误认为您可以“清空数组”或必须“(重新-)在(重新)使用之前重新初始化”它。我谈到了这一点,因为最有效和最优雅的代码是省略代码。 不清楚您使用char[] 数组的目的是什么,但也许您应该考虑改用std::stringstd::vectorstd::array 【参考方案1】:

请注意,您可以覆盖数组的条目。想想你是否真的需要重新初始化。如果没有,覆盖就足够了。

此外,您可以使用初始化列表,它将数组的条目设置为其默认值,对于int,默认值为zero

用一个数组覆盖示例,我先用零填充,然后用一个填充。

int a[N] = ; // I am initialised to the default value already!
int v = 0;
while(v < 2) 
  for(int i =0; i < N; ++i) 
    a[i] = v;
  
  ++v;

您可以使用memsetstd::fill 重新初始化您的数组。

我不建议再次创建数组,因为在内部语言应该搜索 contigius 内存单元,然后分配它们。并且每次循环结束时,它都应该取消分配数组。

重新初始化必须更快。

[编辑]

std::fill or memset?

权衡是memset 可以更快,而std::fill 更安全。

请注意,第一个是 C 函数,第二个是 C++ 函数。

【讨论】:

本地数组默认不初始化。您的 a[N] 包含堆栈垃圾,直到您实际初始化它。 初始化列表会将a[N]的元素设置为默认值。 int a[N]; 没有初始化列表。 !!!!可能在写评论时删除了它。我会编辑,谢谢@T.C.。 我强烈推荐std::fill 而不是 C++ 中的memset【参考方案2】:

只需重用数组,并使用另一个 for 循环重新初始化其值。这可能是你最好的选择。

【讨论】:

以上是关于在while循环中重新初始化数组[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 While 循环中初始化关联数组?

循环语句和数组

逗号运算符do while循环嵌套循环数组简介

如何在while循环中重新初始化向量?

是否可以将数组元素与没有循环的硬编码初始化列表进行比较? [关闭]

04Java基础语法(循环嵌套breakcontinue方法方法的重载数组动态初始化)