我有一个整数数组,每次调用一个函数时,我都希望将数组中的所有值都设置为'x'。
我看过memset,但这只适用于我认为的字节数组。
我可以做明显的for循环,但我猜测有一个标准的lib函数可以更好地完成这个。谁知道?
答案 0 :(得分:2)
只是循环它,非常。或memset
为0,如果您知道该值为零(对于您了解该位表示的其他值,则类似)。没有标准的lib解决方案,因为标准的lib不能知道特定的用户类型。
答案 1 :(得分:2)
如果您使用的是x86系统,则可以使用某些程序集。例如,在gcc中:
__asm__(
"rep stosb"
: "=a"('x'), "=c"(count), "=D"(array)
);
应该做的伎俩。
rep stosb
获取AL
中的值,并将其分配给ES:EDI
指向的连续内存位置。位置数量在ECX
。
顺便说一下,在最近的处理器Intel has made many efforts to improve the performance of MOVSB
and STOSB
中,这是一个很好的方法。
答案 2 :(得分:1)
除了memset
和循环(两者都是O(n)
时间),它实际上可以在O(1)
中完成 - 但是以三倍为代价内存量,以及后来更昂贵的查找。
This article描述了如何做到这一点。
这个想法是维护额外的堆栈(逻辑上,实现为数组+指向顶部的指针)和数组,附加数组将指示它何时首次初始化(从0到n的数字),堆栈将指示哪些元素已经修改。
当您访问array[i]
时,如果stack[additionalArray[i]] == i && i < top
数组的值为array[i]
。否则 - 它是&#34;初始化&#34;值。
执行array[i] = x
时,如果尚未初始化(如前所述),则应设置additionalArray[i] = stack[top]
并增加top
。
这会导致O(1)
初始化,但正如所说它需要额外的内存,每次访问都更加广泛。
答案 3 :(得分:0)
以下逻辑将帮助您。
...
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);
}
}