為什麼棧沒有讀取並彈出的函數?

為什麼棧沒有讀取並彈出的函數呢


除了會有異常的問題,拷貝也帶來額外性能消耗。

既然訪問末端元素與彈出都是獨立需求,設計兩個API是必須的。外加一個組合功能的API,所帶來的問題多於收益。

當然,在做內部使用、僅限特定元素類型的stack時,可以hack成怎樣都可以。


因為如果把 top 和 pop 做到同一個函數里,難以做到強異常安全。

top 目前返回的是個元素引用類型,但是如果集成到 pop 里,就必須得是個元素類型:

// 純示意用,現實中的實現肯定沒有這樣簡單
template &
T stack&::pop()
{
if (top_ &< 0) { throw std::exception(); } return elements_[top_--]; }

返回元素類型意味著複製,那麼,如果返回時拷貝構造函數拋出異常會發生什麼呢?

top_ 已經減了,但是拷貝失敗了。這個元素就這麼被狗吃了?

(以上僅為示意,實際可能更複雜,比如 pop 的時候內部維護的那個元素可能已經被 delete 掉了。)


我補充一下實踐的問題吧。。

用Python的Query進行多進程通信時,我無數次感到不能先看一眼棧頂再決定取不取這個元素的蛋疼。。。

因為它只有一個get()。。。


Java(逃


stack中pop()函數執行時會調用元素的析構函數,清除元素對象;top()函數會反回棧頂元素的引用。當設計成poptop時,必須完成這兩部分功能。因為原來棧頂元素已經析構了,就不能反回引用類型。返回值傳回去的時候會有元素的隱形構造函數調用,如果這個構造函數出了異常(比如堆空間不夠了),就會出現棧中元素數目減了,卻沒有得到棧頂元素的情況。(手機打字,太累。。)


高分答案已經說明是因為異常安全。這裡補充推薦一本書《exceptional c++》,這本書裡面提到了關於異常安全的更多的內容。


不是很懂你究竟想要什麼。要麼讀取,要麼彈出。

pop本來就要返回棧頂元素啊。

標準stack操作定義:

Push

Pop

Peek

Isempty

Size

Internal: grow


推薦閱讀:

這個程序哪錯了?求大神指點
大家是怎麼學習Pyqt5的?
C++的模板元編程是否降低運行效率?
如何控制python多線程的退出?

TAG:程序員 | 編程 | 程序 | STL |