C++ выделяет вопрос о синтаксисе массива

Вы можете написать так:

int test[] = {1,2,3,4};

но что, если вы хотите использовать указатель и выделить его новым?

int *test2;
test2 = new int[]{1,2,3,4};

Это не работает, какой синтаксис или это возможно?

3 ответа

Решение

Это один из недостатков действующего стандарта C++. Инициализация не является равномерной. Ваша лучшая надежда - равномерная инициализация в C++ 0x, но в то же время вы можете назначить значения после создания массива, например

int *test2;
test2 = new int[4]; // Note that you still have to specify the size in C++0x
test2[0] = 1;
test2[1] = 2;
test2[2] = 3;
test2[3] = 4;

Если ваш компилятор поддерживает C++ 0x

int *test2;
test2 = new int[4] {1,2,3,4}; // Initializer list in C++0x

должно сработать. Однако вы всегда должны использовать std::vector вместо массивов в стиле C при написании хорошего кода на C++.

Первый синтаксис называется агрегатной инициализацией, и вы не можете применить его к динамически распределенному массиву. При динамическом размещении вы должны указать количество элементов, которые вы хотите инициализировать, в квадратных скобках и (необязательно) значение по умолчанию в скобках (если вы хотите инициализировать массив). Значение по умолчанию будет одинаковым (если присутствует) для всех элементов.

Возможно, вы захотите заглянуть в библиотеку boost::assign, которая может поддерживать этот тип инициализации (не уверен). В качестве альтернативы вы можете (за счет большего количества кода) сделать это самостоятельно для типов POD:

int * array = new int[4];
{
   int values[] = { 1,2,3,4 };
   memcpy( array, values, sizeof(values) );
}

Или для не-типа:

type * array = new type[4];
{
   type values[] = { 1,2,3,4 }; // assuming type(int) constructor
   std::copy( values, values+4, array ); // better to use some magic to calculate size
}

В любом случае оба эти решения требуют локального размещения и копирования (bit-size/ C++) в динамически выделяемую память.

Другие вопросы по тегам