2014-12-03 8 views
1

Как установить размер моего массива равным размеру моего вектора. Вот мой код:Как назначить размер вектора размеру массива C++?

vector<Point> data_obj; 
int my_array[data_obj.size()] 

, но я получаю ошибки компиляции, говоря:

error C2057: expected constant expression 
error C2466: cannot allocate an array of constant size 0 

Я не понимая ошибку. Не могли бы вы дать какое-то объяснение?

+1

Вы не можете. Размер массивов на C++ должен быть известен во время компиляции. Зачем вам это нужно? Просто продолжайте использовать вектор. Если вам нужен базовый массив, либо выполните '& data_obj [0]', либо вызовите 'data_obj.data()'. – Borgleader

+0

Я просто пытаюсь установить размер массива равным размеру вектора, поэтому всякий раз, когда векторные данные увеличивают размер массива, приспосабливайтесь к нему. –

+2

@ArsalanSherwani ... массивы не настраиваются. Это то, что означает 'std :: vector' (и почему вы обычно используете его вместо этого). – crashmstr

ответ

4

Как говорится в ошибке, размер статического массива должен быть постоянным во время компиляции. Возможно, что размер std::vector может измениться во время выполнения, поэтому размер массива не гарантированно будет постоянным. Вы должны были бы сделать динамический массив

int* my_array = new int[data_obj.size()]; 

И не забудьте удалить его после C2057

delete[] my_array; 
+2

Хотя лучшим способом сделать динамический массив будет 'std :: vector my_array = data_obj;' (если вы не можете просто используйте 'data_obj.data()'). –

+1

@MikeSeymour Вот как эти вопросы всегда имеют тенденцию развиваться. «Мне нужен массив, размер которого не известен во время компиляции, а не постоянный во время выполнения». Так что просто используйте вектор! Тем не менее, они начали с вектора .... так что кажется, что мы собираемся сделать шаги назад: P – CoryKramer

+0

@Cyber ​​Чтение между строками, что они, вероятно, * на самом деле * хотят, это 'std :: vector :: data()' – sjdowling

0

ошибка: ожидается постоянное выражение

data_obj.size() не является постоянной величиной, когда вы выделяете массив, но это должно быть - это одно из требований. Если вы хотите сделать что-то подобное, вам нужно динамическое распределение.

ошибка C2466: не может выделить массив постоянного размера 0

в этом случае (если вы ничего для вектора не ставить), его размер равен нулю. Вы не можете создать массив с размером 0.

+0

Вы можете создать массив размером 0, просто не статически: 'int * my_array = new int [0];'. – Noel

-3

Дело в том, что массивы, выделенные с помощью «классического» синтаксиса (например, int a [5]), выделяются в стеке. Поэтому во время компиляции вам нужно знать, насколько велик массив, поскольку компилятору необходимо изменить значение SP (указатель стека). С другой стороны, область памяти вектора находится в куче, например массивы, выделенные через malloc/new. Поэтому вы можете подождать до времени выполнения, узнать, сколько памяти вам нужно, и распределить ее соответственно.

Выделение стека/vs имеет также другие плюсы и минусы: распределение стека происходит быстрее, так как вам просто нужно уменьшить значение регистра, но стек ограничен по размеру, и если ваш массив слишком велик, вы получите с исключением переполнения стека, что может привести к появлению странных вещей, например, создание червоточины, сбрасывающей весь этот сайт на ваш HDD :-). Куча с другой стороны медленнее, и слишком много выделений/освобождений может привести к фрагментации памяти.

+0

Массивы можно выделить практически везде. – MSalters

+0

Я указал, что массивы, выделенные новым/malloc, переходят в кучу, но массивы, выделенные через «классический» массив sintax (например, int a [5]), находятся в стеке. Почему downvote? –

+1

Ну, есть глобальные массивы, строковые литералы (которые являются глобальными), массивы в структурах на куче, статике, и все это «классический синтаксис», но не в стеке. Кроме того, C'99 показывает, что вы фактически можете изменить SP на количество времени выполнения, поэтому это также не является техническим ограничением. – MSalters

Смежные вопросы