有谁知道为什么std :: queue,std :: stack和std :: priority_queue不提供clear()
成员函数?我必须假装一个这样的:
std::queue<int> q;
// time passes...
q = std::queue<int>(); // equivalent to clear()
clear()
由可用作底层容器的所有东西提供。是否有充分的理由不让容器适配器提供它?
答案 0 :(得分:19)
嗯,我认为这是因为clear
不被视为对队列,优先级或队列的有效操作(顺便说一下,deque不是,而适配器是容器)。
使用容器的唯一原因 适配器队列而不是容器 德奎是要明确你的意思 仅执行队列操作,和 没有其他操作。 (from the sgi page on queue)
因此,当使用队列时,您所能做的就是推/弹元素;清除队列可以被视为违反FIFO概念。因此,如果您需要清除队列,可能它不是真正的队列,您应该更好地使用双端队列。
然而,这种事情的概念有点狭隘,我认为像你一样清理队列是公平的。
答案 1 :(得分:11)
Deque有明确的()。例如,参见http://www.cplusplus.com/reference/stl/deque/clear.html。
但是,队列没有。但是,为什么你会选择队列而不是deque呢?
使用容器的唯一原因 适配器队列而不是容器 德奎是要明确你的意思 仅执行队列操作,和 没有其他行动。
(http://www.sgi.com/tech/stl/queue.html)
所以我认为clear()不是队列操作。
答案 2 :(得分:2)
我会说这是因为容器适配器不是容器。
答案 3 :(得分:1)
您可以清除队列(以及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();
}
答案 4 :(得分:-1)
我认为这取决于实现 - 直到最近Microsoft STL还没有明确的几个容器。 (现在,例如this quick google result)
但是,clear()通常只是对erase(begin(),end())的调用,因此请实现自己的等效项并使用它。
我认为标准指的是在迭代器范围内清除擦除,因此以上是大多数实现将提供的内容。 (eg Dinkumware's)
答案 5 :(得分:-2)
std :: queue,std :: deque和std :: priority_queue是容器适配器,只提供少量方法来访问底层容器。
您可以清除基础容器,只要您可以访问它。为此,请创建基础容器以传递给apadptor构造函数。例如:
std::deque< int > d;
std::queue< int > q( d );
... time passes ...
d.clear();
编辑:其他信息
我也应该警告你在这里谨慎行事,因为在底层容器上调用方法可能会破坏适配器所做的假设。在这方面,你目前清理队列的方式似乎更合适。