如何有效地销毁队列?

时间:2017-04-21 07:56:30

标签: c++ c++11 memory-management linked-list queue

我实现了自己的队列数据结构。我使用单向链表实现了队列。它是在类定义中实现的。链表的头部指向队列的前面,链表的尾部指向队列的末尾。注意,我只保留尾部以在O(1)时间内进行推动操作。

现在,类的push函数为值动态分配内存,然后将其推送到列表的末尾。 pop函数释放为前面的值分配的内存。

当队列被破坏时(超出范围)我想释放分配的内存,所以我为队列编写了一个析构函数。我的析构函数遍历整个链表并删除链表的每个元素。时间复杂度为O(n)。有没有办法减少队列的时间复杂度?是否可以在O(1)中销毁队列?如果我只取消了链表的头部,则链表的其余元素将不会被删除,并且当删除头时,将无法删除链表的其他元素。如何实现STL队列的析构函数?它是否会破坏O(1)或O(n)中的整个队列?

这里是my_queue的析构函数代码:

/*
Node is a struct which is the nodes of the linked list.
It has two attributes: val(of type char) and next(of type node*)
*/
my_queue :: ~my_queue(){
    node * temp;
    while(head != NULL){
        temp = head;
        head = head->next;
        delete temp;
    }
    sz = 0;
    tail = NULL;
}

1 个答案:

答案 0 :(得分:1)

  

是否可以在O(1)中销毁队列?

如果您打算继续使用链接列表,请不要这样做。 O(n)是破坏链表(或任何基于节点的数据结构)的最优渐近复杂度。

如果您使用非平凡的析构函数存储对象,也不会。你不能在恒定的时间内调用N个析构函数。

如果您选择其他数据结构来实现您的队列,那么也许。如果元素是可以轻易破坏的,则可以在恒定时间内销毁动态增长的数组(即向量)。

  

如何实现STL队列的析构函数?它是否会破坏O(1)或O(n)中的整个队列?

std::queue只是一个较低级别容器的包装器。它的析构函数只是破坏你选择的底层容器。复杂性就是容器的析构函数的复杂性。对于任何具有非平凡析构函数的对象的容器,O(n),对于具有普通析构函数的std::deque元素的所有std::liststd::vector,O(1),O(n)。

在这里,根据对free的调用或者释放内存的任何内容来描述复杂性。 free本身的复杂性可能无法保证不变。