3

我有一个整数数组,我想在每次调用函数时将数组中的所有值设置为“x”。

我看过 memset ,但这只适用于我认为的字节数组。

我可以做明显的 for 循环,但我猜有一个标准的 lib 函数可以更好地完成这个。有人知道吗?

4

4 回答 4

2

循环一下,差不多。或memset为 0,如果您知道该值为零(与您了解位表示的其他值类似)。不会有标准库解决方案,因为标准库不知道特定的用户类型。

于 2013-02-02T20:24:04.197 回答
2

如果您使用的是 x86 系统,则可以为此使用一些程序集。例如,在 gcc 中:

    __asm__(
            "rep stosb"
            : "=a"('x'), "=c"(count), "=D"(array)
           );

应该做的伎俩。

rep stosb取值AL并将其分配给 指向的连续内存位置ES:EDI。位置的数量在 中指定ECX

顺便说一句,在最近的处理器中,英特尔已经做出了很多努力来提高 和 的性能MOVSBSTOSB所以这是一个很好的方法。

于 2013-02-02T20:28:34.977 回答
1

除了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)初始化,但如前所述,它需要额外的内存,并且每次访问都更加广泛。

于 2013-02-02T20:24:11.700 回答
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);
    }
}
于 2013-02-02T20:30:11.130 回答