将原始数组初始化为一个值

发布于 2024-08-28 06:06:13 字数 71 浏览 6 评论 0原文

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

:)

Is there a way to initialize an array of primitives, say a integer array, to 0? Without using a for loop? Looking for concise code that doesn't involve a for loop.

:)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

雪化雨蝶 2024-09-04 06:06:13
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 只是您试图避免的循环的包装器,并且 = {}; 可以用这样的术语来实现。

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

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

Note if you want a more generic way to get the end:

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

To get:

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

It should be mentioned std::fill is just a wrapper around the loop you're trying to avoid, and = {}; might be implemented in such terms.

因为看清所以看轻 2024-09-04 06:06:13

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

如果您要声明静态或本地数组,请使用 = {} 初始值设定项

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

如果您要使用 new[] 创建数组,请使用 ()

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

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

class C {
  int a[100];

  C() : a() // all zeros
  {
    ...
  }
};

Yes, it is possible. The initialization method depends on the context.

If you are declaring a static or local array, use = {} initializer

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

If you are creating an array with new[], use () initializer

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

If you are initializing a non-static member array in the constructor initializer list, use () initializer

class C {
  int a[100];

  C() : a() // all zeros
  {
    ...
  }
};
俏︾媚 2024-09-04 06:06:13

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

You can use memset if you want all your values to be zero. Also, if you're only looking to initialize to zero, you can declare your array in such a way that it is placed in the ZI section of memory.

笑叹一世浮沉 2024-09-04 06:06:13

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

int a[100];
memset(a, 0, sizeof(a));

If the number is zero you could also use memset (though this is more C-style):

int a[100];
memset(a, 0, sizeof(a));
莫言歌 2024-09-04 06:06:13

双 A[10] = { 值 }; // 将 A 初始化为值。
我不记得值是否必须编译为常量。
不适用于自动数组

double A[10] = { value }; // initialize A to value.
I do not remember if value has to be compiled constant or not.
will not work with automatic arrays

静水深流 2024-09-04 06:06:13

有多种方法可以隐藏您使用不同语法所做的事情,这就是其他答案给您的 - std::fill、memset、={} 等。但在一般情况下(不包括编译器特定的技巧(如 ZI 之一),考虑编译后的代码需要做什么:

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

换句话说,需要以相当基本的方式存在一个循环。

There are ways of concealing what you are doing with different syntax, and this is what the other answers give you - std::fill, memset, ={} etc. In the general case, though (excluding compiler-specific tricks like the ZI one), think about what needs to be done by the compiled code:

  • it needs to know where your memory
    block/array starts;
  • it needs to set each element of the
    block to the value in turn;
  • it needs to check repeatedly whether
    the end of the block has been reached.

In other words, there needs to be a loop in a fairly fundamental way.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文