在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::string
、std::vector
或std::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;
您可以使用memset
或std::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循环中重新初始化数组[关闭]的主要内容,如果未能解决你的问题,请参考以下文章