Есть ли способ статической инициализации динамически распределенного массива в C ++? - PullRequest
13 голосов
/ 21 сентября 2010

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

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

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

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

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

Ответы [ 6 ]

28 голосов
/ 21 сентября 2010

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

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

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

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

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

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

vector<int> v = list_of(1)(2)(3);
8 голосов
/ 21 сентября 2010

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

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

4 голосов
/ 21 сентября 2010

Чтобы избежать бесконечных 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 aswell;

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])]);

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

2 голосов
/ 21 сентября 2010

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

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));
1 голос
/ 21 сентября 2010

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

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

0 голосов
/ 21 сентября 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...