增加队列大小并找到最短的队列

时间:2013-02-20 15:59:37

标签: c++ loops for-loop queue

我有一个范例,在向量队列的循环中,如果第i个队列的条件为真,则将第i个队列的队列化增加5。在此操作之后,我需要搜索所有队列的队列大小并在最短队列中排队。 我想做类似下面给出的代码

#include <vector> 
#include <queue> 
int min_index = 0;
std::vector<std::queue<int> > q
std::size_t size = q.size();
for( i=0; i<size; i++){ 
    if(..) {// A condition is true
 //increase the size of the ith queue by 5 more times
}

if(q[min_index].size() > q[i].size())
        min_index = i; // Now q[min_index] is the shortest queue
} 
q[min_index].push(int)
}

如果条件为真,如何以人为方式增加队列大小?然后搜索队列并找到最短的队列。

已更新

#include <vector> 
#include <deque> 
int min_index = 0;
std::vector<std::deque<int> > q
std::size_t size = q.size();
for( i=0; i<size; i++){ 
   if(...) {// A condition is true
  q[i].resize(q[i].size() + 5)
}
if(q[min_index].size() > q[i].size())
        min_index = i; // Now q[min_index] is the shortest queue
} 
q[min_index].push(int)
}

2 个答案:

答案 0 :(得分:3)

“增加队列大小”并不清楚你的意思。

如果您的意思是“增加队列容量”,则不需要。队列的默认底层容器是deque,它不是内存中的连续块,因此不会遇到任何扩展问题,因此无需提前reserve()。有关详细信息,请参阅here

因此,队列的大小就是其中的项目数。如果你想增加那个,deque有一个resize()函数,它可以将所有新项目的指定值作为参数,或者只是对它们进行值初始化。

答案 1 :(得分:1)

这是一种可行的方法(假设C ++ 11是一个选项,否则该示例很容易在没有lambdas和auto的情况下重写):

#include <vector>
#include <queue>
#include <algorithm>

// Don't use this in your real code: I use it here just for convenience.
// It is a bad programming practice to import a whole namespace (especially
// if it is a Standard Library namespace).
using namespace std;

// The function that defines your condition on each queue
bool cond_on_q(queue<int> const& q)
{
    bool satisfied = false;
    // Determine whether the condition is satisfied...
    return satisfied;
}

int main()
{
    vector<queue<int>> v = ...; // Initialize your vector of queues somehow

    // Iterate over the vector of queues
    for (auto& q : v)
    {
        if (cond_on_q(q)) // Is the condition satisfied?
        {
            // Insert 5 elements with any valid value (for instance, 0)
            for (int i = 0; i < 5; i++) (q.push(0));
        }
    }

    // Determine the queue with the minimum size.
    auto i = min_element(begin(v), end(v),
        [] (queue<int> const& q1, queue<int> const& q2) { 
            return q1.size() < q2.size(); 
            }
        );

    int newValue = ...; // Initialize the value to be enqueued somehow.        

    // Add the value to the queue with minimum size.
    i->push(newValue);
}