2013-01-17 97 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