c++之STL中队列的数据插入删除速度

Data insertion and deletion speed of queue in STL of c++

我对c++ STL中队列的插入和删除速度有疑问。

当我尝试使用我制作的 Dequeue 解决算法问题时,我遇到 运行 超时问题。

所以我认为我的 Dequeue 太慢了,我想知道我的 Dequeue 和 c++ STL 中的队列有什么区别。

这是我的队列代码。

请多多指教

在这段代码中,我假设 Node class 中的 value 不能有负数。

class Node
{
private:
    int value;

    Node* prev;
    Node* next;

public:
    Node();
    Node(int value);
    Node(int value, Node* next);
    ~Node();

    void setValue(int value);
    void setPrev(Node* prev);
    void setNext(Node* next);

    int getValue();
    Node* getPrev();
    Node* getNext();
};

Node::Node()
    : value(-1), prev(nullptr), next(nullptr)
{
}

Node::Node(int value)
    : value(value), prev(nullptr), next(nullptr)
{
}

Node::Node(int value, Node* next)
    : value(value), prev(nullptr), next(next)
{
}

Node::~Node()
{
}

void Node::setValue(int value)
{
    this->value = value;
}

void Node::setPrev(Node* prev)
{
    this->prev = prev;
}

void Node::setNext(Node* next)
{
    this->next = next;
}

int Node::getValue()
{
    return this->value;
}

Node* Node::getPrev()
{
    return this->prev;
}

Node* Node::getNext()
{
    return this->next;
}

class Dequeue
{
private:
    Node* front;
    Node* back;

public:
    Dequeue();
    ~Dequeue();

    void pushFront(int value);
    void pushBack(int value);

    void popFront();
    void popBack();

    int getFront();
    int getBack();
    int getSum();
};

Dequeue::Dequeue()
{
    this->back = new Node(-1, nullptr);
    this->front = new Node(-1, this->back);

    this->back->setPrev(front);
}

Dequeue::~Dequeue()
{
}

void Dequeue::pushFront(int value)
{
    Node* node = new Node(value, this->front->getNext());
    node->setPrev(this->front);
    
    this->front->setNext(node);
    node->getNext()->setPrev(node);
}

void Dequeue::pushBack(int value)
{
    Node* node = new Node(value, this->back);
    node->setPrev(this->back->getPrev());

    this->back->setPrev(node);
    node->getPrev()->setNext(node);
}

void Dequeue::popFront()
{
    if (this->front->getNext() == this->back)
        return;

    Node* node = this->front->getNext();
    
    this->front->setNext(node->getNext());
    node->getNext()->setPrev(this->front);

    node->setNext(nullptr);
    node->setPrev(nullptr);
    delete node;
}

void Dequeue::popBack()
{
    if (this->back->getPrev() == this->front)
        return;

    Node* node = this->back->getPrev();

    this->back->setPrev(node->getPrev());
    node->getPrev()->setNext(this->back);

    node->setNext(nullptr);
    node->setPrev(nullptr);
    delete node;
}

int Dequeue::getFront()
{
    if (this->front->getNext() == this->back)
        return -1;

    return this->front->getNext()->getValue();
}

int Dequeue::getBack()
{
    if (this->back->getPrev() == this->front)
        return -1;

    return this->back->getPrev()->getValue();
}

Dequeue是通过链表实现的,其中每个push/pop操作中的节点是allocated/deallocated。 std::queue 是通过 std::deque 实现的,效率更高(它只分配一次)。

如果你需要在中间插入,链表是好的,但你不是这样。 std::deque 基本上是固定大小数组的动态序列。

相关问题:

  • Which STL container should I use for a FIFO?