将数组的所有元素设置为值的最佳方法是什么?

时间:2013-02-02 20:21:03

标签: c

我有一个整数数组,每次调用一个函数时,我都希望将数组中的所有值都设置为'x'。

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

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

4 个答案:

答案 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);
    }
}