1. 程式人生 > 其它 >C++面試常見問題

C++面試常見問題

1. stack 中有 pop() 和 top() 方法,為什麼不直接用 pop() 實現彈出和取值的功能?
如果 stack 中存放的是較大是內容時,比如 vector 型別,取值的時候就會發生拷貝,如果拷貝失敗,這是,

假設有一個stack<vector>,vector是一個動態容器,當你拷貝一個vector時,標準庫會從堆上分配很多記憶體來完成這次拷貝。當這個系統處在重度負荷,或有嚴重的資源限制的情況下,這種記憶體分配就會失敗,所以vector的拷貝建構函式可能會丟擲一個std::bad_alloc異常。當vector中存有大量元素時,這種情況發生的可能性更大。當pop()函式返回“彈出值”時(也就是從棧中將這個值移除),會有一個潛在的問題:這個值被返回到呼叫函式的時候,棧才被改變;但當拷貝資料的時候,呼叫函式丟擲一個異常會怎麼樣?如果事情真的發生了,要彈出的資料將會丟失;它的確從棧上移出了,但是拷貝失敗了!std::stack的設計人員將這個操作分為兩個部分:先獲取頂部元素(top()),然後從棧中移除元素(pop())。這樣,在不能安全的將元素拷貝出去的情況下,棧中的這個資料還依舊存在,沒有丟失。當問題是堆空間不足時,應用可能會釋放一些記憶體,然後再進行嘗試。

參考:為什麼介面卡stack中成員函式top()和pop()需要分離實現