7

有没有办法将基元数组(比如整数数组)初始化为 0?不使用 for 循环?寻找不涉及 for 循环的简洁代码。

:)

4

6 回答 6

18
int array[10] = {}; // to 0

std::fill(array, array + 10, x); // to x

请注意,如果您想要一种更通用的方式来结束:

template <typename T, size_t N>
T* endof(T (&pArray)[N])
{
    return &pArray[0] + N;
}

要得到:

std::fill(array, endof(array), x); // to x (no explicit size)

应该提到std::fill它只是您试图避免的循环的包装,并且= {};可能以这样的方式实现。

于 2010-04-12T21:24:01.467 回答
10

对的,这是可能的。初始化方法取决于上下文。

如果要声明静态或本地数组,请使用= {}初始化程序

int a[100] = {};  // all zeros

如果您要创建一个数组,请new[]使用()初始化程序

int *a = new int[100](); // all zeros

如果要在构造函数初始化程序列表中初始化非静态成员数组,请使用()初始化程序

class C {
  int a[100];

  C() : a() // all zeros
  {
    ...
  }
};
于 2010-04-12T21:34:01.067 回答
1

如果数字为零,您也可以使用 memset(尽管这更像是 C 风格):

int a[100];
memset(a, 0, sizeof(a));
于 2010-04-12T21:36:04.573 回答
1

如果您希望所有值都为零,则可以使用 memset。此外,如果您只想初始化为零,您可以声明您的数组,使其放置在内存的 ZI 部分中。

于 2010-04-12T21:34:38.947 回答
0

有一些方法可以用不同的语法隐藏你正在做的事情,这就是其他答案给你的 -std::fill, memset, ={}等等。但在一般情况下(不包括像 ZI 这样的编译器特定技巧),想想需要做什么通过编译的代码:

  • 它需要知道你的内存块/数组从哪里开始;
  • 它需要将块的每个元素依次设置为该值;
  • 它需要反复检查是否已到达块的末尾。

换句话说,需要有一个相当基本的循环。

于 2010-04-12T22:28:28.593 回答
0

double A[10] = { value }; // initialize A to value. 我不记得值是否必须编译为常量。不适用于自动数组

于 2010-04-12T22:15:44.087 回答