快速背景
我是一个 Java开发人员,在我的空闲/无聊的时间里一直在玩C.
我是一个 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()检查对象的效率更低,因为在这种情况下绝对没有复制.