2013-01-17 70 views
0

我有一个范例,每个线程有一个队列。我希望找到队列数量最小的队列,我使用下面的代码。排队在最小尺寸队列

std::vector<std::queue<task> > q; 

int min_value = INT_MAX; 
std::size_t size = q.size(); 
for(i=1; i<size; i++){ //accessing loop of queues 
    if(min_value > q[i].size()) 
    min_value = q[i].size(); 
} 

现在我想在此做一个额外的运算,每次只有最小尺寸队列(从上面的代码中)应该排队的任务。

q.get (min_value) 
q.push(task) // will this one, does the required operation? 
+0

'std :: vector'没有'get'成员。 – Nawaz

+0

你的'for'循环会忽略'q'的第一个元素,它位于索引0处。如果你想访问所有的队列,你应该将'i'初始化为0,而不是1.或者,考虑使用range-基于for循环:'for(auto&each_queue:q)'然后访问'each_queue'而不是'q [i]'。 –

回答

2

我想你要找的是向量中最小的队列q。如果是这样,你可以这样做:

auto cmp = [](std::queue<task> const & a, std::queue<task> const & b) { 
       return a.size() < b.size(); 
      }; 

//note q is a std::vector of std::queue 
auto min_queue = std::min_element(q.begin(), q.end(), cmp); 

min_queue->push(item);//min_queue is the iterator to the smallest queue 

而且,我相信,在你的代码,i=1是一个错误,我认为应该是i=0,如果你想搜索整个载体,即从开始到结束。如果你真的是指i=1,那么你必须这样做:

auto min_queue = std::min_element(q.begin() + 1, q.end(), cmp); 

希望有所帮助。

+0

我认为OP真的想要最小大小的队列,所以他最好存储由'std :: min_element'返回的迭代器,然后使用它。 – Gorpik

+0

@Gorpik:哦,也许吧。让我补充一点。 – Nawaz

+0

将std ::队列支持q.begin(),q.end()操作?我想我只在std :: deque – Dev