我使用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();
}
}
发布于 2009-04-02 10:23:56
清除标准容器的一个常见习惯用法是与容器的空版本进行交换:
void clear( std::queue<int> &q )
{
std::queue<int> empty;
std::swap( q, empty );
}
它也是实际清除某些容器(std::vector)内的内存的唯一方法
发布于 2009-04-02 10:19:44
是的--对queue类有一点错误,IMHO。这就是我要做的:
#include <queue>
using namespace std;;
int main() {
queue <int> q1;
// stuff
q1 = queue<int>();
}
发布于 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;
}
https://stackoverflow.com/questions/709146
复制相似问题