有没有更好的方法在C++中初始化已分配的数组?

Pra*_*rav 6 c++ arrays pointers initialization

如何用另一种(也许更短的)方式写这个?有没有更好的方法在C++中初始化已分配的数组?

int main(void) {
   int* a;
   a = new int[10];
   for (int i=0; i < 10; ++i) a[i] = 0;
}
Run Code Online (Sandbox Code Playgroud)

Pra*_*rav 37

 int *a =new int[10](); // Value initialization
Run Code Online (Sandbox Code Playgroud)

ISO C++ Section 8.5/5

对值类型T的对象进行值初始化意味着:

- 如果T是具有用户声明的构造函数(12.1)的类类型(第9节),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的);

- 如果T是没有用户声明的构造函数的非联合类类型,则T的每个非静态数据成员和基类组件都是值初始化的;

- 如果T是数组类型,则每个元素都是值初始化的;

- 否则,对象被零初始化

对于术语之间的差异zero initialization,value initializationdefault initialization阅读此内容

  • 这个*更好,因为它可以很好地处理对象数组和模板上下文.但请记住,对于上面给出的简单示例,生成的代码可能非常相似(可能相同). (3认同)

Bri*_*ndy 22

std::vector<int> vec(10, 0); 
int *a = &vec.front();
Run Code Online (Sandbox Code Playgroud)


Chr*_*isF 20

你可以用 memset

将ptr指向的内存块的第一个num字节设置为指定值(解释为unsigned char).

  • 老了,我知道,但是没有理由使用`memset`.`std :: fill`是一种更通用的方式来获取相同的东西(这意味着代码可以是一致的),而不会丢失. (5认同)

Jus*_*ini 20

三种方式怎么样?

1.    int *a = new int[10]();

2.    std::vector<int> a(10, 0);

3.    int *a = new int[10];
      memset(a, 0, sizeof(int) * 10);
Run Code Online (Sandbox Code Playgroud)

由于受欢迎的需求,还有更多:

4.    int *a = new int[10];
      std::fill(a, a + 10, 0);

5.    std::vector<int> a(10);
      std::fill(a.begin(), a.end(), 0);
Run Code Online (Sandbox Code Playgroud)

  • 没有`:: std :: fill`?:-) (3认同)