Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么不';t标准C++;容器适配器是否提供清晰的功能?_C++_Stl_Standards - Fatal编程技术网

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

C++ 为什么不';t标准C++;容器适配器是否提供清晰的功能?,c++,stl,standards,C++,Stl,Standards,有人知道为什么std::queue、std::stack和std::priority\u queue不提供clear()成员函数吗?我必须这样做: std::queue<int> q; // time passes... q = std::queue<int>(); // equivalent to clear() std::队列q; //时光流逝。。。 q=std::queue();//相当于clear() IIRC,clear()由任何可以用作底层容器的东西提供

有人知道为什么std::queue、std::stack和std::priority\u queue不提供
clear()
成员函数吗?我必须这样做:

std::queue<int> q;
// time passes...
q = std::queue<int>();  // equivalent to clear()
std::队列q;
//时光流逝。。。
q=std::queue();//相当于clear()

IIRC,
clear()
由任何可以用作底层容器的东西提供。是否有充分的理由不让容器适配器提供它?

我认为这取决于实现-直到最近,Microsoft STL还没有在多个容器上提供clear。(现在有了,如)

然而,clear()通常只是一个擦除调用(begin(),end()),所以实现您自己的等效函数并使用它

我认为标准将clear称为迭代器范围内的擦除,因此大多数实现都会提供上述内容。()

Deque有清晰的()。参见,例如

然而,队列并不是这样。但你为什么会选择排队而不是戴克呢

使用容器的唯一原因 适配器队列而不是容器 deque要明确你是 仅执行队列操作,以及 没有其他行动

()


所以我猜clear()不是一个队列操作。

我想这是因为容器适配器不是容器。

好吧,我想这是因为
clear
被认为不是队列、优先级队列或堆栈上的有效操作(顺便说一句,deque不是适配器,而是容器)

使用容器的唯一原因 适配器队列而不是容器 deque要明确你是 仅执行队列操作,以及 没有其他行动

因此,当使用队列时,您所能做的就是推送/弹出元素;清除队列可视为违反FIFO概念。因此,如果您需要清除队列,可能它不是真正的队列,您最好使用deque


但是,这种概念有点狭隘,我认为像您这样清除队列已经足够公平了。

std::queue、std::deque和std::priority_queue是容器适配器,只提供少量方法来访问底层容器

只要可以访问底层容器,就可以清除它。为此,请创建底层容器以传递给apadptor构造函数。例如:

std::deque< int > d;
std::queue< int > q( d );

... time passes ...

d.clear();
std::dequed;
std::queueq(d);
... 时光流逝。。。
d、 清除();
编辑:其他信息

我还应该警告您在这里要小心,因为对底层容器调用方法可能会破坏适配器所做的假设。在这方面,您当前清除队列的方式似乎更可取。

您可以清除队列(以及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();
}
#包括
使用名称空间std;
类可清除队列:公共队列
{
公众:
无效清除()
{
//队列中的容器“c”被故意保留保护状态
c、 清除();
}
};   
int main(int argc,字符**argv)
{
可清除队列a;
a、 清除();
}

stack、queue和priority\u queue也没有迭代器。Daniel,这是不正确的,队列的构造函数参数仅用于初始化队列,而不是传递对实际容器的引用。换句话说,“q”将用“d”的内容初始化,但清除“d”不会影响“q”。有趣的是,我所看到的构造函数没有对集合进行常量引用……请重试,你是对的。适配器持有一个集合be值,而不是引用,适配器的构造函数对集合进行常量引用以进行初始化。有趣的是,在VS2008中,队列的“c”成员是公共的!它在优先级队列中受保护。即使不添加实例变量,也不应从标准容器公开继承:通过基类指针删除派生类而不使用虚拟析构函数将导致未定义的行为(不保证调用基类析构函数)。