Как освободить один элемент массива? - PullRequest
0 голосов
/ 27 апреля 2018

Я выделяю память так:

int *array = new int[n];
array[5] = 3;

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

delete[]

освободит используемую память, но я не хочу, чтобы весь массив был удален, а только некоторые элементы, такие как первый, для реализации списка FIFO. Как я могу освободить первый элемент, а затем выделить место для нового элемента в конце массива, не удаляя все это? Можно ли это сделать с помощью векторов вместо int?

Ответы [ 2 ]

0 голосов
/ 06 мая 2018
  1. Вы можете реализовать FIFO, используя кольцевой буфер: просто введите две переменные: first и last, запишите новые элементы в array[last % RingBufferSize] с последующим приращением last и прочитайте элементы с array[first % RingBufferSize] с последующим приращением из первых; когда first == last это означает, что ваш FIFO пуст, когда (first + 1) % RingBufferSize == last % RingBufferSize это означает, что ваш FIFO заполнен, и вы не можете добавить, не отклоняя самый старый элемент. При таком подходе вы можете использовать статический массив и полностью избежать использования кучи трафика.
  2. Использовать двоичную кучу с ключами, взятыми из порядка сложения (сначала самый старый). При таком подходе вам придется увеличивать выделенную память для вашего массива только тогда, когда он переполняется (это означает «никогда», если ваш источник данных и приемник данных работают с одинаковой скоростью и вам нужна очередь для демпфирования потока данных). Сама двоичная куча имеет сложность около log(N) для добавления и удаления, что гораздо лучше, чем O(N) исправление дыры в вашем массиве путем копирования его в новый массив без удаления элемента.
0 голосов
/ 27 апреля 2018

После выделения вы можете полностью освободить память. Частичное нанесение покрытия невозможно. Тем не менее, вы можете перераспределить другое пространство с желаемым количеством элементов, а затем скопировать более ранний контент во вновь выделенные и освободить более ранний. Например,

int *array = new int[n];
array[5] = 3;
std::vector<int> myvec(n1); // n1 is the new size
std::copy (array, array+std::min(n1,n), myvec.begin() );
delete [] array;
...