如何在C ++中有效地将整个队列复制到矢量/数组?
说我有一个std :: queue,在某些时候我想把它复制到vector / a数组然后对它进行排序。
感谢大家的回答。
我真正想做的是创建一个具有固定长度的窗口,在某些时候我需要复制此窗口中的所有元素并对它们进行排序。窗口正在移动,有新数据通过另一个接口进入,所以我想使用队列。有没有更好的实施?
答案 0 :(得分:2)
如果您只想保留已排序的队列,请查看priority_queue。
答案 1 :(得分:2)
您写道:
我真正想做的是创建一个具有固定长度的窗口,在某些时候我需要复制此窗口中的所有元素并对它们进行排序。窗口正在移动,有新数据通过另一个接口进入,所以我想使用队列。
我建议退后一步,重新考虑一下你是否真的想使用queue
。我想你想要它,因为你
不幸的是,std::queue
不太适合(3)。因此,我建议寻找地址(2)和(3)的东西,然后考虑编写某种类型的包装器(可能是一个只是添加一个元素到队列中的普通函数?)来实现(1) )。
例如,我考虑使用普通std::deque
。它可以在恒定时间内从队列的开头/结尾添加/删除元素。在窗口上获取排序视图也很容易,例如如果复制队列的元素很便宜,你可以使用std::sort
之类的:
std::vector<Elem> sortedView( queue.begin(), queue.end() );
std::sort( sortedView.begin(), sortedView.end() );
...你当然也可以做一些更聪明的事情,不是复制数据,而是在队列中创建vector
个迭代器,或者使用不同的排序算法,如partial_sort
。< / p>
答案 2 :(得分:0)
访问std :: queue元素的唯一方法是使用front
,back
,push
,pop
的组合,因为std::queue
没有迭代器。 (为了能够使用迭代器,你应该直接使用底层容器(例如std :: deque),而不是std :: queue。
由于您想要制作副本(可能会将元素保留在队列中),因此您可以在弹出元素后将元素推回队列。
此外,由于您知道队列的大小,因此可以使用vector::reserve
来防止由vector::push_back
触发的昂贵的内存重新分配。
所以
std::vector<int> V;
std::queue<int> Q;
V.reserve(Q.size());
for(size_t numPos = 0; numPops < Q.size(); ++numPops) {
V.push_back(Q.front());
Q.pop();
Q.push(V.back());
}
std::sort(V.begin(), V.end());
答案 3 :(得分:0)
老实说,最好的选择是从一开始就使用正确的STL数据结构。如果您想要对数据进行排序,那么std :: queue 不是正确的数据结构。
考虑使用map(或者可能是哈希映射)。地图的典型实现实际上构建地图已排序,查找在O(ln)时间内执行。如果你真的想要,你仍然可以按顺序遍历地图。