我正在使用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) 我偶然发现了这个问题,其答案使用了一个奇怪的结构:
typedef std::queue<int> Q;
typedef Q::container_type C;
C & get (Q &q)
{
struct hack : private Q {
static C & get (Q &q) {
return q.*&hack::c;
}
};
return hack::get(q);
}
Run Code Online (Sandbox Code Playgroud)
我通常遵循它q可以访问c由get函数引用的自己的成员.但是,我无法清楚地解释它.究竟发生了什么.*&,为什么允许?
我刚问了一个关于访问STL适配器的底层容器的问题.我得到了一个非常有用的答案:
template <class T, class S, class C>
S& Container(priority_queue<T, S, C>& q) {
struct HackedQueue : private priority_queue<T, S, C> {
static S& Container(priority_queue<T, S, C>& q) {
return q.*&HackedQueue::c;
}
};
return HackedQueue::Container(q);
}
int main()
{
priority_queue<SomeClass> pq;
vector<SomeClass> &tasks = Container(pq);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,我无法理解这一行:
return q.*&HackedQueue::c;
Run Code Online (Sandbox Code Playgroud)
这条线做什么?此外,该行怎么可以访问私有容器priority_queue传递给函数Container?
是否有一种简单的方法可以std::queue在C++中通过其值获取元素的位置?
例如:
std::queue<int> numbers;
numbers.push(7);
numners.push(4);
numbers.push(11);
int position = numbers.getPosition(4); //should be 1
Run Code Online (Sandbox Code Playgroud) 我在许多情况下都在使用队列,队列可能增长到数百个。不幸的是,如果有必要的话,没有一种解决队列清空的方法。我想知道是否使用作用域队列进行交换,然后销毁作用域队列,是否破坏了任何内存分配/管理规则?
以下代码段是我建议的示例。如果长时间使用,似乎工作正常,不确定结果。
#include <cstdlib>
#include <iostream>
#include <queue>
int
main()
{
std::queue<int> foo;
foo.push(10);
foo.push(20);
foo.push(30);
std::cout << "size of before foo: " << foo.size() << '\n';
{
std::queue<int> bar;
swap(foo, bar);
}
std::cout << "size of after foo: " << foo.size() << '\n';
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我有两个priority_queue用float这样的:
std::priority_queue<float> queue1;
std::priority_queue<float> queue2;
Run Code Online (Sandbox Code Playgroud)
我需要合并它们。但是 STLmerge算法不允许priority_queue直接使用:
merge(
queue1.begin(), queue2.end(),
queue2.begin(), queue2.end(),
queue1
);
Run Code Online (Sandbox Code Playgroud)
有priority_queue没有不使用辅助数据结构的方式进行合并?