У меня есть массив объектов
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]
Есть ли способ реализовать это?
Вы не можете реализовать это, удаляя или освобождая элементы, потому что вы выделили массив как одну область памяти. Регион может быть освобожден только целиком, а не частями.
Однако, как уже упоминали другие, вы можете использовать различные методы, чтобы «виртуализировать» массив и сделать так, чтобы элементы приходили и уходили:
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).
Ну, один из способов реализовать это — реализовать это буквально: сдвинуть данные в массиве, скопировав «пакет 4» в начало массива, «пакет 3» в следующий элемент и так далее. Заполните неиспользуемый остаток массива тем значением элемента, которое в вашем случае означает «пустой».
Помните, что в C ++ нет встроенной концепции «пустого» элемента массива. Вам придется либо реализовать это вручную, создав какое-то зарезервированное состояние вашего Timed_packet
объект, который обозначает «пустой» пакет. Или, в качестве альтернативы, вы можете просто помнить, что ваш массив теперь содержит только 4 элемента, а остальные считаются «пустыми» независимо от состояния.
Да, вы можете вручную написать цикл, чтобы переместить все влево и заполнить оставшиеся элементы «пустым» значением (возможно, nullptr
, или же NULL
если вы не используете C ++ 11).