我正在使用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();
}
}
Run Code Online (Sandbox Code Playgroud)
Dav*_*eas 246
清除标准容器的常用习惯是使用容器的空版本进行交换:
void clear( std::queue<int> &q )
{
std::queue<int> empty;
std::swap( q, empty );
}
Run Code Online (Sandbox Code Playgroud)
它也是实际清除某些容器内的内存的唯一方法(std :: vector)
小智 42
是的 - 有点像队列类的错误,恕我直言.这就是我做的:
#include <queue>
using namespace std;;
int main() {
queue <int> q1;
// stuff
q1 = queue<int>();
}
Run Code Online (Sandbox Code Playgroud)
小智 23
'David Rodriguez','anon'该主题的作者询问如何"有效地"清除队列,因此我认为他希望复杂性高于线性O(队列大小).您提供的方法具有相同的复杂性:根据stl引用,operator =具有复杂度O(队列大小).恕我直言,因为队列的每个元素都是单独保留的,并且它不会分配在一个大的内存块中,就像在向量中一样.因此,为了清除所有内存,我们必须分别删除每个元素.所以最明确的方法operator =是一行:
while(!Q.empty()) Q.pop();
Run Code Online (Sandbox Code Playgroud)
tim*_*tim 15
显然,有两种最明显的方法可以清除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;
}
Run Code Online (Sandbox Code Playgroud)
在C ++ 11中,您可以通过执行以下操作清除队列:
std::queue<int> queue;
// ...
queue = {};
Run Code Online (Sandbox Code Playgroud)
您可以创建一个继承自 queue 的类并直接清除底层容器。这是非常有效的。
template<class T>
class queue_clearable : public std::queue<T>
{
public:
void clear()
{
c.clear();
}
};
Run Code Online (Sandbox Code Playgroud)
也许您的 a 实现还允许您的 Queue 对象(此处JobQueue)继承std::queue<Job>而不是将队列作为成员变量。这样您就可以直接访问c.clear()您的成员函数。