gpt4 book ai didi

c++ - 为什么 std::priority_queue 没有 clear() 成员函数

转载 作者:可可西里 更新时间:2023-11-01 16:39:58 31 4
gpt4 key购买 nike

我今天做了一些黑客攻击,发现 std::priority_queue 没有 clear()成员函数。是否有任何技术原因可以说明为什么标准委员会可能将其排除在外?

需要说明的是,我知道通过赋值很容易解决这个问题:

oldPQ = std::priority_queue<int>{};

此解决方案不太理想,因为:

  1. 它需要你重复类型——这不会在维护下继续工作。正如 @chris 在下面指出的那样,如果您使用默认构造函数,您可以简化它,但如果您有自定义比较器,这可能是不可能的。
  2. std::priority_queue不能在需要 clear() 的模板函数中使用成员函数。
  3. 不符合其他容器提供的公共(public)接口(interface)通常是不可取的。特别是,来自 std::forward_list 的所有内容至 std::unordered_mapstd::stringclear() .我注意到的唯一其他异常(exception)是​​ std::array,其语义没有意义,以及 std::stackstd::queue ,当 std::deque 时语义更值得怀疑无需任何额外努力即可工作。

一个项目看起来像一个问题,但在实践中不一定是:因为内部容器用于 std::priority_queue是模板化的,可能没有 clear()它自己的成员函数,这会产生一个有趣的问题,特别是它提出了向后兼容性的问题。这不是问题,因为:

  1. 对于不提供 clear() 的内部容器, 只要没有人试图调用 std::priority_queue::clear() ,代码将继续编译。
  2. SFINAE 仍然有可能通过调用 clear() 来提供新接口(interface)(清除成员)可用时在内部容器上,如果不可用则反复弹出。

我认为这是 C++ 标准的缺陷。假设技术讨论没有提供强有力的案例说明为何省略此方法,我打算继续创建标准提案。

编辑:

似乎这是在委员会内部处理的(注意最后一篇文章):https://groups.google.com/a/isocpp.org/forum/?fromgroups#!searchin/std-discussion/clear/std-discussion/_mYobAFBOrM/ty-2347w1T4J

http://wg21.cmeerw.net/lwg/issue2194

最佳答案

众所周知,容器适配器的规范过于迂腐:因为相应数据结构的“抽象”规范(来自一些关于抽象算法和数据结构的书)不包括操作clear规范的优先级队列或堆栈,它不在适配器中提供。这确实经常导致在实践中使用这些适配器非常不方便。

不过,好消息是内部容器成员在适配器内部声明为适配器的 protected 成员,名为c。这可能是专门为您完成的,以便能够轻松实现您自己的适配器版本:通过继承标准适配器并添加您想要添加的任何成员函数,包括 clear

至于将这些适配器的接口(interface)与标准容器接口(interface)进行比较……我认为这不是一个有效的比较。这些适配器从未打算在接口(interface)方面与容器兼容。恰恰相反,这些适配器的目的主要是限制数据结构的公共(public)接口(interface),并迫使它进入规范抽象定义所允许的狭窄范围内。

例如,不允许迭代规范堆栈。根据定义,堆栈不是“可迭代的”。堆栈适配器禁用迭代接口(interface)这一事实是一件好事。但是缺少 clear 肯定让人觉得太迂腐了,因为它具有很大的实用值(value),而且看起来不像是对规范接口(interface)的严重违反。

关于c++ - 为什么 std::priority_queue 没有 clear() 成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19166175/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com