kimbsu00
kimbsu00

Reputation: 45

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

I have question about insertion and deletion speed of queue in c++ STL.

When i tried to slove algorithm question using Dequeue i made, i face running time out problem.

So i think my Dequeue is so slow, and i want to know what is the difference between my Dequeue and queue in c++ STL.

Here is my queue code.

Please give me some advice.

In this code, i suppose value in Node class can't have negative number.

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

Upvotes: 0

Views: 75

Answers (1)

Daniel Langr
Daniel Langr

Reputation: 23497

You Dequeue is implemented via a linked list, where nodes are allocated/deallocated in each push/pop operation. std::queue is implemented via a std::deque, which is much more efficient (it allocates only once a while).

Linked lists are good if you need to insert in the middle, but this is not your case. std::deque is basically a dynamic sequence of fixed-size arrays.

Relevant questions:

Upvotes: 2

Related Questions