Есть ли лучший способ инициализировать выделенный массив в C ++? - PullRequest
6 голосов
/ 14 июля 2010

Как написать это другим (возможно, более коротким) способом? Есть ли лучший способ инициализировать выделенный массив в C ++?

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

Ответы [ 10 ]

37 голосов
/ 14 июля 2010
 int *a =new int[10](); // Value initialization

ISO C++ Section 8.5/5

Инициализация значения объекта типа T означает:

- если T является типом класса (раздел 9) с пользователем-объявленный конструктор (12.1), затем вызывается конструктор по умолчанию для T (и инициализация некорректна, если у T нет доступного конструктора по умолчанию);

- если T является типом класса без объединения без пользователя- объявленный конструктор, то каждый нестатический элемент данных и компонент базового класса T инициализируется значением;

- если T является типом массива, то каждый элемент инициализируется значением;

- в противном случае объект инициализируется нулями

Для различий между терминами zero initialization, value initialization и default initialization прочитайте this

22 голосов
/ 14 июля 2010
std::vector<int> vec(10, 0); 
int *a = &vec.front();
20 голосов
/ 14 июля 2010

Как насчет 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);
20 голосов
/ 14 июля 2010

Вы можете использовать memset

Устанавливает первые n байтов блока памяти, указанного указателем ptr, в указанное значение (интерпретируется как символ без знака).

4 голосов
/ 14 июля 2010
int main(void) { int *a; a = new int[10]; for(int i=0;i<10;++i) a[i]=0; }

; -)

2 голосов
/ 14 июля 2010
int *a = (int*) calloc(10, sizeof(*a));

(и проверьте, является ли NULL, или переписать безопасную оболочку против calloc).

2 голосов
/ 14 июля 2010
#include <algorithm>

int main() {
    int *a = new int[10];
    std::fill(a, a + 10, 0);
}
1 голос
/ 14 июля 2010

Может быть, вы могли бы попробовать что-то вроде этого:

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;
}
0 голосов
/ 15 июля 2010

кстати, а как насчет использования calloc ()? скажем

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

ну, я просто еще один парень С ... любой комментарий приветствуется здесь

0 голосов
/ 14 июля 2010

Я парень 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 (условие).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...