【问题标题】:C++ - Min value in queueC++ - 队列中的最小值
【发布时间】:2012-06-19 11:41:50
【问题描述】:

我有结构类型的队列

struct test {
   int numbers;
};

queue<test> q;

如何找到最小值:

q.front().numbers;

例如,如果数字中有 5、1、3,我需要找到 1。

【问题讨论】:

  • q.front().numbers; 只是一个数字,所以这是最小值...
  • 为什么不对队列执行 std::qsort,然后从 front() 中取出数字
  • 根据您要执行的操作,您可以考虑改用std::priority_queue。如果您需要检查队列的内容并保留顺序,则必须改用 std::dequestd::list 等可迭代容器。
  • @AdityaKumarPandey:可能是因为 std::queue 没有迭代器接口,而且 std::sort 无论如何都会比 qsort 更好?
  • @AdityaKumarPandey:如果你想要的只是一个集合的最小值而不是别的,那么迭代集合比对其进行排序更明智,因为它会是 O(N)。毕竟没有排序算法比这更快!

标签: c++ struct queue


【解决方案1】:

由于您需要一个整数队列,因此最简单的解决方案是使用std::deque&lt;int&gt;。然后您可以使用std::min_element 查找队列中的最小元素:

std::deque<int> q{5, 1, 3};
std::deque<int>::iterator it = std::min_element(q.begin(), q.end());
std::cout << *it << std::endl;

这样做,您不需要使用struct test。尤其如此,因为它似乎只存储一个整数。另一方面,如果struct test 更复杂(具有更多字段),那么您可以使用完全相同的方法,但为struct test 定义一个比较函数(有关此类比较函数的示例,请参见@fljx 答案)。

如果您只能使用queue,则您可以执行的操作类型受到限制。因此,您需要执行以下操作:

std::queue<int> q;
/* fill queue ... */
int min_value = INT_MAX;
std::size_t size = q.size();
while (size-- > 0) {
    int x = q.front();
    q.pop();
    q.push(x);
    if (x < min_value)
        min_value = x;
}

【讨论】:

  • OP 有一个 queue,而不是 deque
  • @jrok 好吧,queue 只是 deque 的包装器,它限制了您可以在队列上执行的操作类型。它还阻止访问诸如beginend 等使用min_element 所必需的方法。所以这就是为什么我在回答中说最简单的方法是直接使用deque
  • 好的,但是我需要使用队列而不是双端队列,可以给我展示队列的例子吗?
  • @NikolaiCekov 如果你只能使用queue,那么我能想到的唯一方法就是在一个循环中清空所有队列并跟踪你在清空它时找到的最小元素.不过,如果您想在找到最小元素后保留queue,那绝对不是一个好主意。您也可以在队列中再次插入弹出的元素,但与使用 deque 相比,这是一项昂贵的操作。
  • @NikolaiCekov 作为参考,我更新了我的答案以仅使用queue 显示示例。
【解决方案2】:

网上有很多解释它的页面。

您需要创建一个operator &lt;,告诉您如何比较您的结构。

struct test {
   int numbers;

    bool operator < ( const test &t ) const
    { return this->numbers < t.numbers; }
};

(我没有测试此代码是否存在任何愚蠢的错误,但如果您发现任何问题,下面的链接可能会有所帮助)。

之后,使用#include &lt;algorithm&gt; 访问min_element()

参考资料: http://www.cplusplus.com/reference/algorithm/min_element/ http://courses.cms.caltech.edu/cs11/material/cpp/donnie/cpp-ops.html

【讨论】:

  • 由于 OP 需要 queuemin_element 将不起作用(queue 没有 beginend 操作)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-09
  • 1970-01-01
  • 1970-01-01
  • 2014-04-08
  • 1970-01-01
  • 2010-11-24
  • 2012-08-16
相关资源
最近更新 更多