Существует ли лучший способ инициализировать выделенный массив в C++?

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

int main(void) {
   int* a;
   a = new int[10];
   for (int i=0; i < 10; ++i) a[i] = 0;
}
6
задан Prasoon Saurav 12 October 2010 в 05:12
поделиться

10 ответов

 int *a =new int[10](); // Value initialization

ISO C ++ Раздел 8.5 / 5

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

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

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

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

- в противном случае объект равен нулю -initialized

Чтобы узнать о различиях между терминами инициализация нуля , инициализация значения и инициализация по умолчанию , прочтите this

37
ответ дан 8 December 2019 в 02:00
поделиться

Как насчет трех способов?

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
ответ дан 8 December 2019 в 02:00
поделиться

Я специалист по 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) .

0
ответ дан 8 December 2019 в 02:00
поделиться
int main(void) { int *a; a = new int[10]; for(int i=0;i<10;++i) a[i]=0; }

;-)

4
ответ дан 8 December 2019 в 02:00
поделиться

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

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

20
ответ дан 8 December 2019 в 02:00
поделиться
std::vector<int> vec(10, 0); 
int *a = &vec.front();
22
ответ дан 8 December 2019 в 02:00
поделиться
#include <algorithm>

int main() {
    int *a = new int[10];
    std::fill(a, a + 10, 0);
}
2
ответ дан 8 December 2019 в 02:00
поделиться

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

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;
}
1
ответ дан 8 December 2019 в 02:00
поделиться

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

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

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

0
ответ дан 8 December 2019 в 02:00
поделиться
int *a = (int*) calloc(10, sizeof(*a));

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

2
ответ дан 8 December 2019 в 02:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: