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

标签 java c++ stack

快速背景
我是一名 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/

相关文章:

java - 在 Sqlite Android 应用程序中的多个表中插入内容值

c++ - 关闭带有工作线程的控制台应用程序

c++ - 存在什么样的堆栈展开库,有什么区别?

c - 如何在循环中声明分配的数组?

python - 当值从顶部存储时,堆栈如何向下增长?

java - 我应该使用 Flash 还是 Java?

java - 如何使用java将三个表连接成一个表以及set方法值应该写在哪里

java - 在java中可逆地改组一个int数组

c++ - boolean 运算符++ 和 --

assembly - 使用 gdb 的堆栈地址