作者jeunder (笨soga笨肥一家笨)
看板CSSE
標題Re: [問題] 關於 qsort
時間Tue Dec 28 00:29:39 2004
※ 引述《ccpz (....)》之銘言:
: 先恭喜一下開版 :)
: 一般來說呼叫函數時不會慢一些
: 所以在C/C++ 中才會有蠻多人在用 #define/inline 宣告函數
: 不過 qsort 函數會不斷呼叫使用者傳入的 compare function
: 這樣不會讓效率比較差嗎?
: 還是說函數內部都是以位元在處理,所以可以彌補一些
: 呼叫函數時的 delay?
所以在 STL 裡, 這些 compare function 都設計成 function object
(如: less, equal_to, greater... 等), 也有人將 function object 稱為 functor,
這是另一種叫法.
顧名思義, function object 就是一個 object, 但可以被當成 function 來使用.
只要將 class 的 function call operator 做 operator overloading 即可完成.
其主要目的有
1.function object 本身就是個 object, 可以像 object 一樣, 便於當參數傳遞.
2.operator function 可以設計成 class 內的 inline function, 可以直接展開.
也就是說, 先將 function object 當成物件參數來傳遞給 qsort, 然後 qsort 會像
呼叫函數一般, 呼叫到 class 的 function call operator, 而 function call
operator 是一個 inline function, 自然會在 qsort 內展開.
你會疑問, 難道傳遞 function pointer 不行嗎?
其實是可以的, 但如此一來, 這個 function 就不會被當成 inline function 展開.
因為既然有 "pointer" 就得有具體的 "address" 存在,
因此就不會被當成 inline function 來對待.
另外, 既然 qsort 可以 function pointer 當參數, 又可以 function object 當參數,
很明顯的, 當然是用到了 template.
當然啦, 你也可以設計出自己的 function object, 傳遞給 qsort 使用,
而 qsort 會像呼叫 inline function 一樣, 直接將你的程式碼展開.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.230.227.203
※ 編輯: jeunder 來自: 61.230.227.203 (12/28 00:53)