【发布时间】:2013-10-03 18:10:18
【问题描述】:
我今天做了一些黑客攻击,发现 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,其语义没有意义,以及std::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
【问题讨论】:
-
oldPQ = {};不应该工作吗?我知道其他原因仍然有效,但这不需要重复类型。 -
@chris - 好收获!从来没有建立过你可以做到的联系。
-
clear是序列和关联容器的要求(它们单独需要)。事实上,似乎所有三个容器适配器、stack、queue和priority_queue都没有clear。 -
另外,如果您想知道某事是否是错误:isocpp forums -- ISO C++ Standard – Discussion。描述:“您想知道为什么某个 C++ 语言或库功能会以这种方式工作吗?多个功能如何交互?或者您是否在标准中发现了错误?”