C++ 如何有效地销毁队列?

C++ 如何有效地销毁队列?,c++,c++11,memory-management,linked-list,queue,C++,C++11,Memory Management,Linked List,Queue,我实现了自己的队列数据结构。我使用单向链表实现了队列。它是在类定义中实现的。链表的头部指向队列的前部,而链表的尾部指向队列的末端。注意,我保留尾部只是为了在O(1)时间内进行推送操作 现在,该类的push函数为一个值动态分配内存,然后将其推送到列表的末尾。pop函数释放为前面的值分配的内存 当队列被销毁(超出范围)时,我想释放分配的内存,因此我为队列编写了一个析构函数。我的析构函数遍历整个链表并删除链表中的每个元素。其时间复杂度为O(n)。有没有办法降低队列的时间复杂度?是否可以销毁O(1)中的

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

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

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

以下是my_队列的析构函数的代码:

/*
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;
}
是否可以销毁O(1)中的队列

如果您打算继续使用链接列表,则不会。O(n)是链表(或任何基于节点的数据结构)销毁的最佳渐近复杂性

如果使用非平凡的析构函数存储对象,则情况也并非如此。不能在固定时间内调用N个析构函数

如果您选择另一个数据结构来实现队列,那么可能。动态增长的数组(即向量)可以在恒定的时间内销毁,如果元素是可销毁的

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

std::queue
只是较低级别容器的包装器。它的析构函数只是销毁您选择的底层容器。复杂性是指容器的析构函数的复杂性。O(n)对于具有非平凡析构函数的对象的任何容器,以及对于具有平凡析构函数的元素的所有
std::deque
std::list
,O(1)对于
std::vector


这里,复杂性是通过调用
free
或任何释放内存的方法来描述的。
free
本身的复杂性可能无法保证是恒定的。

如果使用链表,我认为O(N)是最好的。如果你在类似于std::vector的东西上实现它,你可以得到O(1)为推送和弹出摊销,以及O(1)为自由。@Winestone对于任何非平凡值类型,向量销毁将是O(N)。如果你有n个对象,你需要n次调用析构函数。@juanchopanza你是对的,我假设一个队列是
int
或什么的。向量可以在O(1)中清除吗?我认为它需要与一次空闲调用一样长的时间,这需要很多时间