1

我有一个范例,在向量的队列循环中,如果第 i 个队列的条件为真,则将第 i 个队列的 queuesize 增加 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)
}
4

2 回答 2

3

目前尚不清楚“增加队列大小”是什么意思。

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

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

于 2013-02-20T16:21:11.670 回答
1

这是一种可能的方法(假设 C++11 是一个选项,否则该示例很容易在没有 lambda 和 的情况下重写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);
}
于 2013-02-20T16:17:47.070 回答