【问题标题】:Is there a better way to initialize an allocated array in C++?有没有更好的方法在 C++ 中初始化分配的数组?
【发布时间】:2011-03-15 20:41:41
【问题描述】:

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

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

【问题讨论】:

  • 我投票结束这个问题,因为这个问题非常模糊。有无数的程序符合规定的标准。您的具体问题是什么?

标签: c++ arrays pointers initialization


【解决方案1】:

你可以使用memset

将 ptr 指向的内存块的前 num 字节设置为指定值(解释为无符号字符)。

【讨论】:

  • 老了,我知道,但真的没有理由使用memsetstd::fill 是一种更通用的方法,可以毫无损失地获得相同的东西(这意味着代码可以保持一致)。
  • 由于memset 变化字节,它不能用于非零值。 stackoverflow.com/a/17288891/2680660
【解决方案2】:
 int *a =new int[10](); // Value initialization

ISO C++ Section 8.5/5

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

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

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

——如果T是一个数组类型,那么每个元素都是值初始化的;

否则,对象被零初始化

有关术语zero initializationvalue initializationdefault initialization 之间的区别,请阅读this

【讨论】:

  • 这个更好,因为它可以很好地处理对象数组和模板上下文。但请记住,对于上面给出的简单示例,生成的代码可能非常相似(可能相同)。
【解决方案3】:
int main(void) { int *a; a = new int[10]; for(int i=0;i<10;++i) a[i]=0; }

;-)

【讨论】:

  • 你是对的:int main(){int i,*a=new int[10];for(i=0;i&lt;10;++i)a[i]=0;}
【解决方案4】:
std::vector<int> vec(10, 0); 
int *a = &vec.front();

【讨论】:

  • 甚至不需要 0,因为 int() 是默认值。
【解决方案5】:

3 种方式怎么样?

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);

由于大众需求,更多:

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);

【讨论】:

  • @Omnifarious:我其实正打算加入fill,但我更喜欢数字3而不是4。:)
  • int a[10] = {0}; 也可能是另一种方式。
【解决方案6】:

我是一个 C 人,不太确定“新”到底是做什么的,但这能行吗?


int
main( void ) {
   int i = 10;              // start at the far end of the array
   int *a = new int[10]; 
   while ( i-- ) a[i] = 0;  // while ( i == 9, 8, 7, ... , 0 )
}

只是为了炫耀我最喜欢的新循环计数器:while(condition)。

【讨论】:

  • 1) 为什么i 是静态的? 2)为什么while而不是既定的、惯用的for
  • 如果你是 C 人,calloc :P 在哪里?
  • @Konrad: static 初始化为零;并且whilefor 不同。不过,我同意你的看法:在这个问题的范围之外,如果有人将代码显示为一种很好的做事方式,我会感到不安。
  • @Andrei,我忘了 calloc,该死 :-) 大约 6 个月前我开始尝试这种技术;它开始看起来更干净、更明显了。一开始就犯了很多错误。一个更晦涩的版本:
     int i = 10; int *a = 新的 int[10]; while ( i-- ) a[i] = 0;
【解决方案7】:
#include <algorithm>

int main() {
    int *a = new int[10];
    std::fill(a, a + 10, 0);
}

【讨论】:

    【解决方案8】:

    也许你可以试试这样的:

    int* initIntArray(int size) {
        int *temp = new int[size];
        for(int i = 0; i < size; i++) {
            temp[i]=0;
        }
        return temp;
    }
    
    int main () {
        int* a = initIntArray(10);
        int* b = initIntArray(10);
        int* c = initIntArray(10);
    
        //do stuff with arrays
    
        delete [] a;
        delete [] b;
        delete [] c;
    
        return 0;
    }
    

    【讨论】:

    • 有人否决这个答案是否有原因?我想知道我做错了什么(说真的!!这里没有讽刺)
    • 您的回答似乎很好。我也不明白反对票。
    • 这只是个坏建议;它几乎是 std::fill_n 的精确副本,有缺点但没有好处。
    • 我没有投反对票,但我认为有些人可能遇到的问题是,这与 OP 的原始问题并没有太大偏差。我认为 OP 正试图消除编写一个 for 循环来进行初始化。
    【解决方案9】:
    int *a = (int*) calloc(10, sizeof(*a));
    

    (并检查是否为 NULL,或针对 calloc 重写安全包装器)。

    【讨论】:

      【解决方案10】:

      顺便说一句,使用 calloc() 怎么样? 说

      int i*=(int[10])calloc(10*sizeof(int))

      好吧,我只是另一个 C 家伙.. 欢迎任何评论

      【讨论】:

      • 因为在 C++ 中,人们通常使用new,如果使用calloc,则必须使用free 而不是delete
      • calloc不带两个参数吗? Matbe 你的意思是int i*=(int[10])calloc(10,sizeof(int));
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-15
      • 1970-01-01
      • 2016-07-19
      • 2013-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多