簡體   English   中英

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();
}

You Dequeue是通過鏈表實現的,其中節點在每個推送/彈出操作中分配/解除分配。 std::queue通過std::deque實現,效率更高(它只分配一次)。

如果您需要在中間插入,鏈表很好,但這不是您的情況。 std::deque基本上是固定大小的 arrays 的動態序列。

相關問題:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM