代码之家  ›  专栏  ›  技术社区  ›  Prasoon Saurav

是否有更好的方法来初始化C++中的分配数组?

  •  6
  • Prasoon Saurav  · 技术社区  · 14 年前

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

    int main(void) {
       int* a;
       a = new int[10];
       for (int i=0; i < 10; ++i) a[i] = 0;
    }
    
    10 回复  |  直到 11 年前
        1
  •  37
  •   Community CDub    8 年前
     int *a =new int[10](); // Value initialization
    

    ISO C++ Section 8.5/5

    要对t类型的对象进行值初始化,意味着:

    如果t是一个具有用户声明的构造函数(12.1)的类类型(第9条),则调用t的默认构造函数(如果t没有可访问的默认构造函数,则初始化是不正确的);

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

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

    艾斯 否则,对象初始化为零

    条款之间的差异 zero initialization , value initialization default initialization ,读 this

        2
  •  22
  •   fredoverflow    14 年前
    std::vector<int> vec(10, 0); 
    int *a = &vec.front();
    
        3
  •  20
  •   Justin Ardini    14 年前

    三种方法怎么样?

    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);
    
        4
  •  20
  •   ChrisF    11 年前

    你可以使用 memset

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

        5
  •  4
  •   Jonathan Leffler    14 年前
    int main(void) { int *a; a = new int[10]; for(int i=0;i<10;++i) a[i]=0; }
    

    ;-)

        6
  •  2
  •   Daniel Trebbien    14 年前
    #include <algorithm>
    
    int main() {
        int *a = new int[10];
        std::fill(a, a + 10, 0);
    }
    
        7
  •  2
  •   Andrei Ciobanu    14 年前
    int *a = (int*) calloc(10, sizeof(*a));
    

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

        8
  •  1
  •   jmont    14 年前

    也许你可以试试这样的方法:

    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;
    }
    
        9
  •  0
  •   Pete Wilson    14 年前

    我是个骗子,不太确定“新”到底有什么用,但这行吗?

    
    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(条件)。

        10
  •  0
  •   Jokester    14 年前

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

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

    好吧,我只是另一个C小子……这里欢迎任何评论