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++) в динамически выделяемую память.