今天写代码的时候遇到了个错误。背景是实现一个具有min()操作的栈结构。实现的方案就是在每个栈元素中除了包含入栈的数据之外,同时还保留一个栈的min元素的值。
因为偷懒,所以就只实现了push(), pop()和min()三个操作。min是返回栈顶的元素的min部分,pop返回栈顶元素的数据部分,并将栈顶元素弹出。
因为要验证,最后就写了如下的代码:
while (!s.empty()) {
cout << s.min() << ',' << s.pop() << endl;
}
想到这里,就觉得写出无漏洞的代码真的好难。这种潜在的可能会有副作用的操作真心会容易出错的。进而考虑到关于栈操作,STL中的操作也是,提供top()类似的操作。
在pop()之前要先用top()访问,pop()本身是不返回元素的。这个想法看来还真是有意义的,防止在访问元素时候潜在的副作用。
进一步想起来,在实现各种操作的时候,函数的实现也是不要验证empty()的,用户需要自己验证empty()和full(),否则会出现未定义的行为。