Подтвердить что ты не робот

Есть ли способ статически инициализировать динамически выделенный массив в С++?

В С++ я могу статически инициализировать массив, например:

int a[] = { 1, 2, 3 };

Есть ли простой способ инициализировать динамически распределенный массив для набора ближайших значений?

int *p = new int[3];
p = { 1, 2, 3 }; // syntax error

... или мне абсолютно необходимо скопировать эти значения вручную?

4b9b3361

Ответ 1

Вы можете в С++ 0x:

int* p = new int[3] { 1, 2, 3 };
...
delete[] p;

Но мне нравятся векторы лучше:

std::vector<int> v { 1, 2, 3 };

Если у вас нет компилятора С++ 0x, boost может помочь вам:

#include <boost/assign/list_of.hpp>
using boost::assign::list_of;

vector<int> v = list_of(1)(2)(3);

Ответ 2

Вы должны явно назначить каждый элемент динамического массива (например, в цикле for или while)

Однако синтаксис int *p = new int [3](); инициализирует все элементы до 0 (инициализация значения $8.5/5)

Ответ 3

Чтобы избежать бесконечных push_backs, я обычно инициализирую tr1::array и создаю std::vector (или любой другой контейнер std контейнера) из результата;

const std::tr1::array<T, 6> values = {T(1), T(2), T(3), T(4), T(5), T(6)};
std::vector <T> vec(values.begin(), values.end());

Единственное раздражение здесь заключается в том, что вы должны явно указать количество значений.

Это можно сделать, конечно, без использования tr1::array, а

const T values[] = {T(1), T(2), T(3), T(4), T(5), T(6)};
std::vector <T> vec(&values[0], &values[sizeof(values)/sizeof(values[0])]);

Если вам не нужно явно указывать количество элементов, я предпочитаю первую версию.

Ответ 4

Нет, вы не можете инициализировать динамически созданный массив тем же способом.

В большинстве случаев вы обнаружите, что используете динамическое распределение в ситуациях, когда статическая инициализация в действительности не имеет смысла. Например, когда у вас есть массивы, содержащие тысячи элементов. Так что это обычно не имеет большого значения.

Ответ 5

Использование вспомогательной переменной:

const int p_data[] = {1, 2, 3};
int* p = (int*)memcpy(new int[3], p_data, sizeof(p_data));

или, одна строка

int p_data[] = {1, 2, 3},  *p = (int*)memcpy(new int[3], p_data, sizeof(p_data));

Ответ 6

Никогда не слышал о такой возможности, что было бы неплохо иметь.

Имейте в виду, что путем инициализации массива в коде таким образом

int a[] = { 1, 2, 3 };

..... только выигрывает упрощение написания кода и НЕ производительность. В конце концов, ЦП будет выполнять работу по присвоению значений массиву, как вы это делаете.