作者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)