我今天做了一些黑客攻击,发现 std::priority_queue 没有clear()
成员函数。为什么标准委员会可能忽略了这一点,是否有任何技术原因?
需要明确的是,我知道通过分配很容易解决这个问题:
oldPQ = std::priority_queue<int>{};
此解决方案不太理想,因为:
- 它需要您重复类型 - 这在维护下不会继续工作。正如@chris 在下面指出的那样,如果您使用默认构造函数,则可以简化此操作,但如果您有自定义比较器,则这可能是不可能的。
std::priority_queue
不能在需要clear()
成员函数的模板化函数中使用。- 一般不满足其他容器提供的通用接口是不可取的。特别是,从
std::forward_list
到std::unordered_map
到的一切std::string
都有clear()
。我注意到的唯一其他例外是 std::array ,其语义没有意义,andstd::stack
,当无需任何额外努力即可工作std::queue
时,语义更值得怀疑。std::deque
一个看起来像问题,但实际上不一定是:因为用于的内部容器std::priority_queue
是模板化的,并且可能没有自己的clear()
成员函数,这产生了一个有趣的问题,特别是它提出了向后兼容性的问题. 这不是问题,因为:
- 对于不提供的内部容器,
clear()
只要没有人尝试调用std::priority_queue::clear()
,代码就会继续编译。 - SFINAE 仍然可以通过
clear()
在内部容器可用时调用内部容器并在不可用时重复弹出来提供新接口(clear 成员)。
我认为这是 C++ 标准中的一个缺陷。假设技术讨论没有为为什么省略此方法提供强有力的案例,我打算继续创建标准提案。
编辑:
似乎这正在委员会内处理(注意最后一篇文章):https ://groups.google.com/a/isocpp.org/forum/?fromgroups#!searchin/std-discussion/clear/std-discussion/_mYobAFBOrM /ty-2347w1T4J