【问题标题】:Enqueue in a minimum size queue在最小大小的队列中排队
【发布时间】:2013-01-17 15:36:55
【问题描述】:

我有一个范例,每个线程有一个队列。我希望在队列数量中找到最小大小的队列,我使用以下代码完成了。

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?

【问题讨论】:

  • std::vector 没有get 成员。
  • 您的for 循环忽略了q 的第一个元素,它位于索引0。如果您希望访问所有队列,您应该将i 初始化为0,而不是1。或者,考虑使用基于范围的 for 循环:for (auto&amp; each_queue : q),然后访问 each_queue 而不是 q[i]

标签: c++ loops queue task


【解决方案1】:

我认为您正在寻找的是向量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);

希望对您有所帮助。

【讨论】:

  • 我认为OP确实想要最小大小的队列,所以他最好存储std::min_element返回的迭代器然后使用它。
  • @Gorpik:哦,也许吧。让我添加这个。
  • std::queue 会支持 q.begin()、q.end() 操作吗?我想我只在 std::deque 中看到了这个
  • @Dev:在这里了解std::queueen.cppreference.com/w/cpp/container/queue。如您所见,它没有begin()end() 成员。
  • 是的,这正是我的意思......!它没有 begin() 和 end() 成员。那么你将如何在 std::queue 中使用它?只是为了澄清
猜你喜欢
  • 2010-11-24
  • 1970-01-01
  • 1970-01-01
  • 2016-02-11
  • 1970-01-01
  • 2014-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多