加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 为什么要弹出一个参数?

发布时间:2020-12-14 05:33:02 所属栏目:Java 来源:网络整理
导读:快速背景 我是一个 Java开发人员,在我的空闲/无聊的时间里一直在玩C. 前言 在C中,你经常会看到pop参考的参数: void pop(Item removed); 我明白,用你删除的内容来填写参数是很好的.对我来说完全是有道理的.这样,要求删除顶级项目的人可以看看已删除的内容.
快速背景
我是一个 Java开发人员,在我的空闲/无聊的时间里一直在玩C.

前言
在C中,你经常会看到pop参考的参数:

void pop(Item& removed);

我明白,用你删除的内容来填写参数是很好的.对我来说完全是有道理的.这样,要求删除顶级项目的人可以看看已删除的内容.

但是,如果我在Java中做到这一点,我会做这样的事情:

Item pop() throws StackException;

这样,在弹出后,我们返回:NULL作为结果,将抛出一个Item或异常.

我的C教科书给我上面的例子,但是我看到很多堆栈实现没有参数(例如stl stack).

问题
C应该怎么实现pop函数?

奖金
为什么?

解决方法

为了回答这个问题:你不应该在C中实现pop函数,因为它已经被STL实现了. std::stack容器适配器提供了方法顶部以获取对堆栈顶部元素的引用,并且该方法弹出以删除顶部元素.请注意,如您所询问的,单独的弹出方法不能用于执行这两个操作.

为什么要这样做?

>异常安全:Herb Sutter在GotW #82发表了很好的解释.
>单一责任原则:也在GotW#82中提到.顶部照顾一个责任,流行音乐照顾另一个责任.
>不要支付你不需要的费用:对于一些代码,可以检查顶部元素然后弹出它,而不用复制元素(可能是昂贵的). (这在SGI STL文档中提到.)

希望获取元素副本的任何代码都可以免除额外的费用:

Foo f(s.top());
s.pop();

另外this discussion可能很有趣.

如果你要实现pop来返回值,则无论你是通过值返回还是将其写入out参数,都不重要.大多数编译器实现RVO,它将优化返回值方法与copy-out-out-parameter方法一样高效.请记住,这两者之一可能比使用top()或front()检查对象的效率更低,因为在这种情况下绝对没有复制.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读