为什么标准C ++容器适配器不能提供清晰的功能?

时间:2009-01-29 22:29:12

标签: c++ stl standards

有谁知道为什么std :: queue,std :: stack和std :: priority_queue不提供clear()成员函数?我必须假装一个这样的:

std::queue<int> q;
// time passes...
q = std::queue<int>();  // equivalent to clear()
IIRC,clear()由可用作底层容器的所有东西提供。是否有充分的理由不让容器适配器提供它?

6 个答案:

答案 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();

编辑:其他信息

我也应该警告你在这里谨慎行事,因为在底层容器上调用方法可能会破坏适配器所做的假设。在这方面,你目前清理队列的方式似乎更合适。