有谁知道为什么 std::queue、std::stack 和 std::priority_queue 不提供clear()
成员函数?我必须像这样伪造一个:
std::queue<int> q;
// time passes...
q = std::queue<int>(); // equivalent to clear()
IIRC,clear()
由所有可以作为底层容器的东西提供。是否有充分的理由不让容器适配器提供它?
好吧,我认为这是因为clear
没有被认为是对队列、priority_queue 或堆栈的有效操作(顺便说一下,deque 不是适配器,而是容器)。
使用容器适配器队列而不是容器双端队列的唯一原因是要明确说明您只执行队列操作,而不执行其他操作。(来自队列中的 sgi 页面)
因此,当使用队列时,您所能做的就是推送/弹出元素;清除队列可以看作是对 FIFO 概念的违反。因此,如果您需要清除队列,也许它并不是真正的队列,您最好使用双端队列。
但是,这种观念有点狭隘,我觉得像你这样排长队是公平的。
双端队列有 clear()。参见例如http://www.cplusplus.com/reference/stl/deque/clear.html。
但是,队列没有。但是你为什么要选择队列而不是双端队列呢?
使用容器适配器队列而不是容器双端队列的唯一原因是要明确您只执行队列操作,而不执行其他操作。
( http://www.sgi.com/tech/stl/queue.html )
所以我猜 clear() 不是队列操作。
我会说这是因为容器适配器不是容器。
您可以清除队列(以及 std::stack 和 priority_queue),只要您从它继承即可。容器故意受到保护以允许这样做。
#include <queue>
using namespace std;
class clearable_queue : public queue<int>
{
public:
void clear()
{
// the container 'c' in queues is intentionally left protected
c.clear();
}
};
int main(int argc, char** argv)
{
clearable_queue a;
a.clear();
}
我认为这取决于实现——直到最近微软 STL 还没有明确几个容器。(现在可以了,例如这个快速的谷歌结果)
然而,clear() 通常只是对 erase(begin(), end()) 的调用,因此请实现您自己的等价物并改用它。
我认为该标准将 clear 称为在迭代器范围内擦除,因此以上是大多数实现将提供的。(例如 Dinkumware 的)
std::queue、std::deque 和 std::priority_queue 是容器适配器,仅提供少量方法来访问底层容器。
您可以清除底层容器,只要您可以访问它。为此,请创建底层容器以传递给 apadptor 构造函数。例如:
std::deque< int > d;
std::queue< int > q( d );
... time passes ...
d.clear();
编辑:附加信息
我还应该警告您在这里小心行事,因为在底层容器上调用方法可能会破坏适配器所做的假设。在这方面,您当前清除队列的方式似乎更可取。