我有一个整数数组,每次调用函数时,我想将数组中的所有值都设置为“x”。
我查看了memset,但我认为它只适用于字节数组。
我可以使用显而易见的for循环,但我猜测可能有一个标准库函数能更好地解决这个问题。有人知道吗?
我有一个整数数组,每次调用函数时,我想将数组中的所有值都设置为“x”。
我查看了memset,但我认为它只适用于字节数组。
我可以使用显而易见的for循环,但我猜测可能有一个标准库函数能更好地解决这个问题。有人知道吗?
如果你使用的是x86系统,可以使用一些汇编代码来实现。例如,在gcc中:
__asm__(
"rep stosb"
: "=a"('x'), "=c"(count), "=D"(array)
);
rep stosb
指令将AL
中的值分配给由ES:EDI
指向的连续内存位置。这些位置的数量由ECX
指定。MOVSB
和STOSB
的性能,因此这是一个不错的选择。memset(3)
,而编译器(至少GCC)将为 memset
自行执行此操作(如果您不相信,请检查生成的汇编代码)。结果:一个更难理解、不可移植的程序,没有任何收益(可能比编译器做得更糟糕)。 - vonbrandmemset
的时候,我记不起来了,但我可以记得STOSB
。 - Nathan Fellman只需要简单的循环即可。如果您知道值为零,则可以使用memset
将其设置为零(对于其他您了解位表示的值也是如此)。由于标准库无法了解特定用户类型,因此不会有标准库解决方案。
int myArray [80] = {0}
会将所有数组元素初始化为零。 - Rapptzmemset
和循环(它们都是O(n)
时间复杂度),实际上可以在O(1)
时间内完成,但代价是三倍的内存使用量,并且后续查找更加昂贵。
本文描述了如何实现这一点。array[i]
时,如果stack[additionalArray[i]] == i && i < top
,则数组的值为array[i]
。 否则-它是“初始化”值。array[i] = x
时,如果尚未初始化(如前所述),则应设置additionalArray[i] = stack[top]
并增加top
。O(1)
的初始化,但需要额外的内存,并且每次访问更加昂贵。以下逻辑将对您有所帮助。
...
int a[100] = {0};
int b = 5;
memset_ex(a, 100, &b, sizeof(int));
...
memset_ex(void *buf, int buf_size, void *value, int size_of_type)
{
int i = 0;
for(i = 0; i <= (buf_size - size_of_type); i +=size_of_type)
{
memcpy((buf + i), value, size_of_type);
}
}
for(i=0;i<N;i++) a[i]=5;
好在哪里?我能理解一种叫做“重叠复制”的技术,例如 a[0]=b; memcpy(a+1,a,sizeof(int)*(n-1)); // 但即使是这种情况下也需要优化重叠部分的长度以与缓存行长度完全匹配。 - Aki Suihkonen
memset
可能在内部只是一个循环,所以你的循环也同样好。 - Carl Norummemset(array,'x',sizeof(array))
。 - Rapptzmemset
非常简单明了。它有一些对齐和循环展开的处理,但我不知道它是否“非常花哨”。 - Carl Norum