我有一个整数数组,我想在每次调用函数时将数组中的所有值设置为“x”。
我看过 memset ,但这只适用于我认为的字节数组。
我可以做明显的 for 循环,但我猜有一个标准的 lib 函数可以更好地完成这个。有人知道吗?
我有一个整数数组,我想在每次调用函数时将数组中的所有值设置为“x”。
我看过 memset ,但这只适用于我认为的字节数组。
我可以做明显的 for 循环,但我猜有一个标准的 lib 函数可以更好地完成这个。有人知道吗?
循环一下,差不多。或memset
为 0,如果您知道该值为零(与您了解位表示的其他值类似)。不会有标准库解决方案,因为标准库不知道特定的用户类型。
如果您使用的是 x86 系统,则可以为此使用一些程序集。例如,在 gcc 中:
__asm__(
"rep stosb"
: "=a"('x'), "=c"(count), "=D"(array)
);
应该做的伎俩。
rep stosb
取值AL
并将其分配给 指向的连续内存位置ES:EDI
。位置的数量在 中指定ECX
。
顺便说一句,在最近的处理器中,英特尔已经做出了很多努力来提高 和 的性能MOVSB
,STOSB
所以这是一个很好的方法。
除了memset
和循环(两者都是O(n)
时间)之外,它实际上可以在其中完成O(1)
- 但代价是内存量的三倍,以及以后更昂贵的查找。
本文描述了它是如何完成的。
这个想法是维护额外的堆栈(逻辑上,实现为数组+指向顶部的指针)和数组,额外的数组将指示它何时首次初始化(从 0 到 n 的数字),堆栈将指示哪些元素已被修改。
访问时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);
}
}