2013-01-17 2 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' 루프는 인덱스 0에있는'q'의 첫 번째 요소를 무시합니다. 모든 대기열에 액세스하려면 'i'를 1로 초기화하지 말고 0으로 초기화해야합니다. for for loop :'for (auto & each_queue : q)'를 호출 한 다음'q [i]'대신'each_queue'에 접근하십시오. –

답변

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'에 의해 반환 된 iterator를 저장하는 것이 더 좋을 것이다. – Gorpik

+0

@ Gorpik : 오. 이걸 추가합시다. – Nawaz

+0

std :: queue는 q.begin(), q.end() 연산을 지원합니까? 나는 이걸 std :: deque에서만 보았을 것이라고 생각한다. – Dev