How do I clear the std::queue efficiently?

后端 未结 11 941
醉梦人生
醉梦人生 2020-12-12 09:10

I am using std::queue for implementing JobQueue class. ( Basically this class process each job in FIFO manner). In one scenario, I want to clear the queue in one shot( delet

相关标签:
11条回答
  • 2020-12-12 09:14

    Assuming your m_Queue contains integers:

    std::queue<int>().swap(m_Queue)
    

    Otherwise, if it contains e.g. pointers to Job objects, then:

    std::queue<Job*>().swap(m_Queue)
    

    This way you swap an empty queue with your m_Queue, thus m_Queue becomes empty.

    0 讨论(0)
  • 2020-12-12 09:20

    I do this (Using C++14):

    std::queue<int> myqueue;
    myqueue = decltype(myqueue){};
    

    This way is useful if you have a non-trivial queue type that you don't want to build an alias/typedef for. I always make sure to leave a comment around this usage, though, to explain to unsuspecting / maintenance programmers that this isn't crazy, and done in lieu of an actual clear() method.

    0 讨论(0)
  • 2020-12-12 09:26

    Apparently, there are two most obvious ways to clear std::queue: swapping with empty object and assignment to empty object.

    I would suggest using assignment because it simply faster, more readable, and unambiguous.

    I measured performance using following simple code and I found that swapping in C++03 version works 70-80% slower than assignment to an empty object. In C++11 there is no difference in performance, however. Anyway, I would go with assignment.

    #include <algorithm>
    #include <ctime>
    #include <iostream>
    #include <queue>
    #include <vector>
    
    int main()
    {
        std::cout << "Started" << std::endl;
    
        std::queue<int> q;
    
        for (int i = 0; i < 10000; ++i)
        {
            q.push(i);
        }
    
        std::vector<std::queue<int> > queues(10000, q);
    
        const std::clock_t begin = std::clock();
    
        for (std::vector<int>::size_type i = 0; i < queues.size(); ++i)
        {
            // OK in all versions
            queues[i] = std::queue<int>();
    
            // OK since C++11
            // std::queue<int>().swap(queues[i]);
    
            // OK before C++11 but slow
            // std::queue<int> empty;
            // std::swap(empty, queues[i]);
        }
    
        const double elapsed = double(clock() - begin) / CLOCKS_PER_SEC;
    
        std::cout << elapsed << std::endl;
    
        return 0;
    }
    
    0 讨论(0)
  • 2020-12-12 09:28

    Yes - a bit of a misfeature of the queue class, IMHO. This is what I do:

    #include <queue>
    using namespace std;;
    
    int main() {
        queue <int> q1;
        // stuff
        q1 = queue<int>();  
    }
    
    0 讨论(0)
  • 2020-12-12 09:30

    In C++11 you can clear the queue by doing this:

    std::queue<int> queue;
    // ...
    queue = {};
    
    0 讨论(0)
  • 2020-12-12 09:36

    Author of the topic asked how to clear the queue "efficiently", so I assume he wants better complexity than linear O(queue size). Methods served by David Rodriguez, anon have the same complexity: according to STL reference, operator = has complexity O(queue size). IMHO it's because each element of queue is reserved separately and it isn't allocated in one big memory block, like in vector. So to clear all memory, we have to delete every element separately. So the straightest way to clear std::queue is one line:

    while(!Q.empty()) Q.pop();
    
    0 讨论(0)
提交回复
热议问题