首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何有效地清除std::队列?

如何有效地清除std::队列?
EN

Stack Overflow用户
提问于 2009-04-02 10:16:13
回答 10查看 194.9K关注 0票数 189

我使用std::queue来实现JobQueue类。(这个类基本上以FIFO的方式处理每个作业)。在一个场景中,我想一次性清除队列(从队列中删除所有作业)。我在std::queue类中看不到任何清晰的方法。

如何有效地实现JobQueue类的clear方法?

我有一个在循环中弹出的简单解决方案,但我正在寻找更好的方法。

//Clears the job queue
void JobQueue ::clearJobs()
 {
  // I want to avoid pop in a loop
    while (!m_Queue.empty())
    {
        m_Queue.pop();
    }
}
EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2009-04-02 10:23:56

清除标准容器的一个常见习惯用法是与容器的空版本进行交换:

void clear( std::queue<int> &q )
{
   std::queue<int> empty;
   std::swap( q, empty );
}

它也是实际清除某些容器(std::vector)内的内存的唯一方法

票数 290
EN

Stack Overflow用户

发布于 2009-04-02 10:19:44

是的--对queue类有一点错误,IMHO。这就是我要做的:

#include <queue>
using namespace std;;

int main() {
    queue <int> q1;
    // stuff
    q1 = queue<int>();  
}
票数 53
EN

Stack Overflow用户

发布于 2015-02-26 00:54:06

显然,有两种最明显的方法来清除std::queue:交换为空对象和赋值为空对象。

我建议使用赋值,因为它更快、更易读、更明确。

我用以下简单的代码测量了性能,我发现在C++03版本中交换比赋值给一个空对象慢70-80%。然而,在C++11中没有性能上的差异。不管怎样,我会接受任务。

#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;
}
票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/709146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档