為什麼c 沒有使用函式模板過載qsort等函式,是因為沒有必要嗎?

時間 2021-06-05 02:06:32

1樓:暮無井見鈴

C++ 有 sort 。

(其實標準紙面上 qsort 有過載,不過不是函式模板,而實現上……)

給 qsort 新增過載看起來沒有什麼方便的。 C++ 增加 C 標準庫函式的過載主要就幾個模式:

部分 str*/wcs*/mem* 系列函式增加過載,為了 const 正確性;

大多數數學函式為各種算術型別提供過載,而 C 中 的巨集也做這個;

的函式在 中有增加 locale 引數的過載;

(基本沒有編譯器/標準庫實現支援,但標準裡這麼寫)部分函式提供接收有 C 語言鏈結和 C++ 語言鏈結這兩類不同型別的函式指標的過載,其中也包括 qsort 。但絕大多數編譯器中 C 和 C++ 語言鏈結不導致型別區別(目前其實不合標準),使得標準庫實現缺少這些過載。

注意這裡提供過載的函式都是語義很接近的。

反觀 qsort ,它被設計成半吊子型別擦除(需要使用者補上還原型別的比較函式和物件大小),還只支援連續儲存和可平凡複製型別。 C++ 本身也不該加語義與之類似的過載。

2樓:

C 中沒有模板,沒有過載。哪怕這個標頭檔案被 C++ 引用,你也不能再去搞乙個,否則搞的多混亂啊。再說 C++ 標準庫的東西都是定義在 std 命名空間底下的,沒有定義在全域性命名空間下的。

所以 C++ 索性就又搞了 std::sort,其排序演算法是以多個演算法融合而成的,比如 gcc 實現的 std::sort 就採用的是 introsort,內部針對不同的情況會分別採用快排、堆排、插排三種基本演算法,這樣再叫 qsort 就名不副實了。

std::sort 速度又快,又支援記憶體排布不連續的容器 (比如 deque),型別還安全。這樣相比 qsort 太弱雞了。

C 虛函式不能使用模板類有什麼替代方案

XZiar 說白了就是擦除了型別資訊,又想在執行時恢復出來。C 的問題在於,對於模板,每個例項都是不同的函式,且互相沒有聯絡。所以就需要在編譯期確定這個函式模板的例項。到目前為止目標應該就應該很清晰了,每乙個具體的son呼叫哪個foo 都需要一一對應。形成一一對應的方法很多,大致就是 1.if el...

C 標準庫裡面有關於排序的模板函式,為什麼自己還要寫排序演算法?

我說個理由吧。可以理解為,題主這麼問,是說演算法導論裡都寫了演算法,為啥還要我們背leetcode,這個的確是有爭議的問題,上次寫個紅黑球,我忘了怎麼寫了,看算導自己寫。是不是有時候會手寫演算法,是的,有時候真的不僅僅算導那些演算法,有時候需要並算呀,要用特殊晶元排序呀。還有時候確實快排不合適,已經...

為什麼C 中沒有階乘函式?

呂不鬧 如果只是問為什麼,那麼答案應該是 委員會那些老學究不允許太多無關緊要的功能進入標準。可能他們覺得 CPPer 都能自己寫出來吧。 簡易版 include include include include include using namespace std intmain O 1 版 inc...