【问题标题】:Why doesn't std::queue support a clear() function?为什么 std::queue 不支持 clear() 函数?
【发布时间】:2011-04-21 22:29:50
【问题描述】:

我有一个要求:对于一个函数,我将输入作为数字流。我的意思是,该函数在每次调用中都会被单个号码调用。我使用std::queue 来存储数字流。只有在满足某些条件时,我才需要处理一组收集的数字。如果不满足条件,我需要将所有元素放入队列中,然后开始在其中存储新数字。为了清空队列,我找不到clear() 方法。所以我是这样循环的:

while(!q.empty())
    q.pop();

我得到了一个有效的算法来清除std::queue@

How do I clear the std::queue efficiently?

我的问题是:为什么std::queue 不支持clear() 函数?

既然std::dequestd::vector都支持clear()方法,那么支持std::queue的技术难度是什么?

或者我的上述用例非常罕见,因此不受支持?

【问题讨论】:

    标签: c++ visual-studio visual-c++ stl


    【解决方案1】:

    queue 只是一些底层容器的适配器,默认为deque,具有受限功能(如您在此处所述)。如果您想要完整的功能,请使用底层 deque 而不是 queue

    【讨论】:

      【解决方案2】:

      根据http://www.cplusplus.com/reference/stl/queue/

      队列被实现为容器适配器,它们是使用特定容器类的封装对象作为其底层容器的类,提供一组特定的成员函数来访问它的元素。

      这意味着队列使用了一个已经存在的容器,并且实际上是这个容器的一个接口,作为一个先进先出队列。

      这意味着队列不应该被清除。如果您需要清除队列,这意味着您实际上需要使用一个不是队列的对象,因此您应该使用实际的底层容器类型,默认情况下是双端队列。

      【讨论】:

      • 所以我猜std::queue 是一个受损队列,用途非常有限,是消息吗?
      • 队列适配器背后的基本原理是,插入的项目必须在某个时刻被提取,并且不会使用多元素删除操作丢失。那有意义吗 ?不一定,反正也可以清零……
      【解决方案3】:

      除了已经说过的,您可以很容易地清除队列:

      queue<int> q;
      ...
      q = queue<int>(); // Assign an empty queue
      

      或在 C++11 中

      q = {};
      

      【讨论】:

      • c++11 版本:q = {};
      • 虽然,使用 gcc 4.9.1 q={} 给出错误 converting to std::queue&lt;...&gt; from initializer list would use explicit constructor
      【解决方案4】:

      将此添加到我不断增长的“使 STL 可读”函数列表中:

      template <typename T> 
      void Clear(std::queue<T>& Queue) 
      {
          Queue = std::queue<T>(); // Assign to empty queue
      }
      

      这只是对 sellibitze 出色答案的一个包装,但意味着我不必每次使用该技术时都添加评论。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-02
        • 2021-05-24
        • 1970-01-01
        • 1970-01-01
        • 2014-09-22
        相关资源
        最近更新 更多