如何在C ++中有效地将整个队列复制到矢量/数组?

时间:2013-08-06 19:54:31

标签: c++ vector queue

如何在C ++中有效地将整个队列复制到矢量/数组?

说我有一个std :: queue,在某些时候我想把它复制到vector / a数组然后对它进行排序。

感谢大家的回答。

我真正想做的是创建一个具有固定长度的窗口,在某些时候我需要复制此窗口中的所有元素并对它们进行排序。窗口正在移动,有新数据通过另一个接口进入,所以我想使用队列。有没有更好的实施?

4 个答案:

答案 0 :(得分:2)

如果您只想保留已排序的队列,请查看priority_queue

答案 1 :(得分:2)

您写道:

  

我真正想做的是创建一个具有固定长度的窗口,在某些时候我需要复制此窗口中的所有元素并对它们进行排序。窗口正在移动,有新数据通过另一个接口进入,所以我想使用队列。

我建议退后一步,重新考虑一下你是否真的想使用queue。我想你想要它,因为你

  1. 希望向另一个将数据添加到队列的组件公开一个最小接口。
  2. 在前/后有效添加/删除元素(以实现'固定宽度窗口'概念)
  3. 一种有效的方式来访问窗口中可见的数据
  4. 不幸的是,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元素的唯一方法是使用frontbackpushpop的组合,因为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)时间内执行。如果你真的想要,你仍然可以按顺序遍历地图。