接着上一篇笔记,如何解决,top、pop问题。
方案一
让pop()以参数的形式返回一个引用。
std::vector<int> result;
some_stack.pop(result);
这种方案在大多数情况下都能正常工作。但是它有个严重的缺点,就是需要再调用pop前先构造一个值的实例。有时,这是不切实际的,因为这需要花费时间或资源。另一方面,这也不总是可行的,因为构造一个示例所需的参数在某个时间点有可能是无效的。最后,他要求实例类型是可赋值的,很多自定义类型并不支持赋值操作,
方案二
采用返回值拷贝的pop接口。并且保证stack中值类型保证在copy或move时不抛出异常。尽管可以通过std::is_nothrow_copy_constructible和std::is_nothrow_move_constructible来判断拷贝构造和移动构造函数是否抛出异常,但是那很有限。有很多自定义类型并不能保证这点。
方案三
采用返回指针的pop接口。优点是,可以轻松的拷贝一个指针,并且没有异常抛出。缺点是,需要一系列内存管理操作,对于简单的类型比如int,其开销甚至超过返回一个值拷贝。对于使用这种操作的接口,std::shared_ptr是一个不错的选择,既能避免使用new和delete,又能防止内存泄漏。但是,使用这种策略就要求stack中使用new申请内存,与方案二相比这将需要相当大的开销。
方案四
同时采用方案一和方案二(或者方案三)。如果你已经提供了方案二或者方案三,那么再增加方案一接口是很容易的事。这样,在使用时可以根据实际情况灵活运用。