& Quot; Свободное & Quot; элемент массива в переполнении стека

У меня есть массив объектов

Timed_packet* send_queue = new Timed_packet[num_sequence_numbers]; // size=10

Это будет заполнено Timed_packets в одной точке,
Есть ли какое-либо удаление или освобождение элементов там, а затем смещение массива влево, чтобы заменить то, что было освобождено?

пример

send_queue = [ packet 9, packet 8, packet 7, packet 6, packet 5, packet 4, packet 3, packet 2, packet 1, packet 0]

и я хотел удалить пакет 5 и все слева от него, делая send_queue выглядеть

send_queue = [ packet 4, packet 3, packet 2, packet 1, empty, empty, empty, empty, empty, empty]

Есть ли способ реализовать это?

1

Решение

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

Однако, как уже упоминали другие, вы можете использовать различные методы, чтобы «виртуализировать» массив и сделать так, чтобы элементы приходили и уходили:

packet *queue = new packet[queue_capacity];
packet *begin = queue, *end = queue+queue_capacity, *first = queue, *last = queue;

// add an element to the queue
packet p(...);
*last++ = *p; // note postincrement
if (last == end) last = begin; // the queue is cyclic
if (last == first) throw new queue_overflow(); // ran out of room in the queue!

// remove an element from the queue
if (first==last) throw new queue_underflow(); // ran out of items in the queue!
packet p = *first++; // taken by copy; note postincrement
if (first == end) first = begin; // the queue is still cyclic

Этот код не в моей голове. Возможно, вам придется исправить пару граничных условий, но теория есть.

По сути, это то, что вы получили бы, если бы использовали std :: deque, кроме последних предложений:

  • спектакль
  • портативность
  • тип безопасности
  • безопасность границ
  • соответствие стандартам

РЕДАКТИРОВАТЬ: Одна вещь, которую вы могли бы сделать, чтобы улучшить это, это выделить массив указателей (пакет *) вместо массива значений (пакет). Тогда ваши операции enqueue / dequeue являются копиями указателей на пакеты, а не копиями пакетов. Вы должны убедиться, что распаковщик освободил пакеты, а не перехватчик, но это должно быть на несколько лет быстрее (sic).

1

Другие решения

Ну, один из способов реализовать это — реализовать это буквально: сдвинуть данные в массиве, скопировав «пакет 4» в начало массива, «пакет 3» в следующий элемент и так далее. Заполните неиспользуемый остаток массива тем значением элемента, которое в вашем случае означает «пустой».

Помните, что в C ++ нет встроенной концепции «пустого» элемента массива. Вам придется либо реализовать это вручную, создав какое-то зарезервированное состояние вашего Timed_packet объект, который обозначает «пустой» пакет. Или, в качестве альтернативы, вы можете просто помнить, что ваш массив теперь содержит только 4 элемента, а остальные считаются «пустыми» независимо от состояния.

1

Да, вы можете вручную написать цикл, чтобы переместить все влево и заполнить оставшиеся элементы «пустым» значением (возможно, nullptr, или же NULL если вы не используете C ++ 11).

1
По вопросам рекламы [email protected]