2014-01-19 57 views
0

我有一個函數pop有一個參數,它將元素彈出堆棧。我希望能夠使用pop(),這將從頂部刪除一個元素;和pop(any_number),這將從頂部彈出多個元素。有一件事讓我對一個簡單的實現細節感到好奇。默認參數或函數過載

函數重載:

void pop() { 
    if(!stack.empty()) 
    stack.pop(); 
} 

void pop(int n) { 
    for(int i = 0; i < n; ++i) 
     pop(); 
} 

功能默認參數:

void pop(int n = 1) { 
    for(int i = 0; i < n; ++i) 
     if(!stack.empty()) 
     stack.pop(); 
} 

難道還有比後者一個簡單的代碼,其他區別。使用第一個還是第二個是有優勢的?

編輯:將第一個片段更改爲更可重複使用的設計明智的替換for循環與範圍與pop函數。

+1

我認爲,當你需要經常做一個'pop()',那麼第二個版本可能會比第一個版本慢一點,因爲for循環(更多的代碼,更多的數據)...... – mb84

回答

1

表現明智:沒關係。對於大多數應用程序來說,編譯器足夠聰明,可以在兩種情況下生成高效的代碼。有人可能會爭辯說,第二個版本,在調用pop()的情況下,會產生一個額外的for循環。這實際上可以由編譯器進行簡單優化。

就可讀性而言,第二個肯定更具表現力。但最終它真的歸結爲偏好。選擇一種你認爲最適合你的設計的產品,並記住不要預先優化。