c ++中的“Free”数组元素

时间:2012-10-10 02:01:03

标签: c++ arrays free shift

我有一个对象数组

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

这将在一点上填充Timed_pa​​ckets, 是否有任何删除或释放其中的元素然后将数组移到左边以替换已释放的元素?

实施例

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]

有没有办法实现这个?

3 个答案:

答案 0 :(得分:1)

是的,您可以手动编写循环以将所有内容移到左侧,并使用“空”值填充其余元素(可能是nullptr,如果您不使用C,则填充NULL ++ 11)。

答案 1 :(得分:1)

嗯,实现这一点的一种方法是按字面意思实现它:通过将“数据包4”复制到数组的开头,将“数据包3”复制到下一个元素来转移数组中的数据,依此类推。在您的情况下,使用任何元素值代表“空”填充数组中未使用的其余部分。

请记住,C ++没有内置的数组“空”元素的概念。您将需要通过创建代表“空”数据包的Timed_packet对象的某个保留状态来手动实现它。或者,您可以简单地记住,您的数组现在只包含4个元素,其余部分假定为“空”,无论状态如何。

答案 2 :(得分: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,这基本上就是你得到的,除了后者提供的:

  • 性能
  • 可移植性
  • 类型安全
  • 边界安全
  • 标准合规性

编辑:你可以做的一件事就是分配一个指针数组(packet * ),而不是一个值数组(packet )。然后,您的入队/出队操作是指向数据包的指针的副本,而不是数据包的副本。你需要确保数据包是由dequeuer释放的,而不是由enqueuer释放的,但是这应该是lightyears更快(原文如此)。