Quick background
I’m a Java developer who’s been playing around with C++ in my free/bored time.
Preface
In C++, you often see pop taking an argument by reference:
void pop(Item& removed);
I understand that it is nice to “fill in” the parameter with what you removed. That totally makes sense to me. This way, the person who asked to remove the top item can have a look at what was removed.
However, if I were to do this in Java, I’d do something like this:
Item pop() throws StackException;
This way, after the pop we return either: NULL as a result, an Item, or an exception would be thrown.
My C++ text book shows me the example above, but I see plenty of stack implementations taking no arguments (stl stack for example).
The Question
How should one implement the pop function in C++?
The Bonus
Why?
To answer the question: you should not implement the pop function in C++, since it is already implemented by the STL. The
std::stackcontainer adapter provides the methodtopto get a reference to the top element on the stack, and the methodpopto remove the top element. Note that thepopmethod alone cannot be used to perform both actions, as you asked about.Why should it be done that way?
toptakes care of one responsibility andpoptakes care of the other.Any code that wishes to obtain a copy of the element can do this at no additional expense:
Also, this discussion may be interesting.
If you were going to implement pop to return the value, it doesn’t matter much whether you return by value or write it into an out parameter. Most compilers implement RVO, which will optimize the return-by-value method to be just as efficient as the copy-into-out-parameter method. Just keep in mind that either of these will likely be less efficient than examining the object using top() or front(), since in that case there is absolutely no copying done.