gpt4 book ai didi

java - 为什么 pop() 应该接受一个参数?

转载 作者:可可西里 更新时间:2023-11-01 16:25:59 26 4
gpt4 key购买 nike

快速背景
我是一名 Java 开发人员,在空闲/无聊的时间里一直在玩弄 C++。

前言
在 C++ 中,您经常看到 pop 通过引用获取参数:

void pop(Item& removed);

我知道用您删除的内容“填充”参数很好。这对我来说完全有意义。这样,要求删除顶部项目的人就可以查看删除的内容。

但是,如果我要在 Java 中执行此操作,我会这样做:

Item pop() throws StackException;

这样,在 pop 之后我们返回:作为结果的 NULL,一个 Item,或者一个异常将被抛出。

我的 C++ 教科书向我展示了上面的示例,但我看到大量不带参数的堆栈实现(例如 stl stack)。

问题
如何在C++中实现pop函数?

红利
为什么?

最佳答案

要回答这个问题:你不应该在 C++ 中实现 pop 函数,因为它已经由 STL 实现了。 std::stack容器适配器提供了方法 top 来获取栈顶元素的引用,以及方法 pop 来移除栈顶元素。请注意,正如您所询问的那样,pop 方法不能单独用于执行这两个操作。

为什么要这样做?

  1. 异常安全: Herb Sutter 在 GotW #82 中对该问题给出了很好的解释.
  2. 单一职责原则:也在 GotW #82 中提到。 top 负责一个职责,pop 负责另一个职责。
  3. 不要为不需要的东西买单:对于某些代码,检查顶部元素然后弹出它可能就足够了,而无需制作(可能很昂贵的)拷贝元素。 (这在 SGI STL 文档中有所提及。)

任何希望获取该元素拷贝的代码都可以免费执行此操作:

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

此外,this discussion可能很有趣。

如果您要实现 pop 以返回值,那么无论是按值返回还是将其写入 out 参数都无关紧要。大多数编译器实现 RVO ,这将优化按值返回方法,使其与复制到输出参数方法一样高效。请记住,与使用 top() 或 front() 检查对象相比,这两种方法中的任何一种都可能效率较低,因为在那种情况下绝对没有完成复制。

关于java - 为什么 pop() 应该接受一个参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2756233/

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