Есть ли способ статически инициализировать динамически выделенный массив в С++?
В С++ я могу статически инициализировать массив, например:
int a[] = { 1, 2, 3 };
Есть ли простой способ инициализировать динамически распределенный массив для набора ближайших значений?
int *p = new int[3];
p = { 1, 2, 3 }; // syntax error
... или мне абсолютно необходимо скопировать эти значения вручную?
Ответы
Ответ 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 };
..... только выигрывает упрощение написания кода и НЕ производительность.
В конце концов, ЦП будет выполнять работу по присвоению значений массиву, как вы это делаете.