2011-07-17 111 views
4

可能重複:
C Analog To STL在C高的高級數據結構

通常情況下,在C編程的時候,我發現自己希望,我不得不像載體或列表類的訪問從C++開始,我最終實現了某種高級數據結構的精簡版本,但需要相當長的時間。我想知道是否有人知道C中的高質量簡單數據結構的好庫?

+1

http://stackoverflow.com/questions/201413/c-analog-to-stl – darlinton

回答

5

嗯,還有的GLib庫,庫,而這一點正是用來實現GTK +構件集。 GLib使用GObject作爲在C中執行OOP的一種方法。但是,GObjectified C以非常冗長而聞名。

+0

謝謝,但我正在尋找一些比這更輕量級的東西。 – Slubb

+0

glib不是「重」,只是避免使用GObjects並假裝使用OO。 – ShinTakezou

0

我喜歡GLib這種東西;你最終編寫的代碼是乾淨的,這些庫易於使用,穩定,成熟和跨平臺,並且文檔非常好。

您可能還需要看一看Rusty Russell的CCAN項目。我沒有使用任何代碼,但我肯定會去沾我的腳趾在接下來的時間我有類似的需求:

http://ccan.ozlabs.org/

理念

那的C代碼不錯段應被移出垃圾代碼目錄並暴露於更廣泛的世界,在那裏他們可以成爲有用的東西。

CCAN是成功的CPAN項目的Perl代碼開發和 共享後鬆散建模。

1

除了耍貧嘴的其他人所說,你可以沒有任何類型的安全創建自己的泛型類型,如使用void *作爲通用指針指向下一個堆棧對象的鏈接列表。一些甚至用宏在ANSI C中創建類似模板的行爲並取得了一些合理的成功。在cplusplus.com的論壇中搜索一個或兩個示例(如果我記得正確的話,那裏的數量不會多於此)。

或者如紙Object-Oriented Programming With ANSI C描述你能實現自己的OOP方案,但它的東西,我不會建議。你不妨花費一些時間來創建這個野獸(並且可能不知道它是如何工作的),並學習一些GLib來熟悉它。

個人而言,我更喜歡第一種方法。你失去了類型安全性並獲得了一堆強制類型,但這是最快實施的。該方法的真正問題是存儲的數據。轉換爲C的std::stack<int>只是一個結構堆棧,它具有類型爲int的數據字段。 std::vector<std::stack<int> >,整數堆棧的可尋址列表呢? C標準不能保證從一個指針類型轉換爲一個整型的類型可以在沒有信息丟失的情況下工作。換句話說,雖然你可以使用指針,但你不能使用普通整數來存儲信息。也許有一些展開的模板專門化工作 - 一個用於int(一個用於long long?),一個用於double,另一個用於指針類型。

最後,最好的解決辦法是使用像GLib的圖書館,但如果你喜歡推出自己的,創建時要小心。你永遠不知道什麼時候需要容器中物品類型的組合。

+1

「C標準無法保證從指針類型轉換爲整數類型可以在沒有信息丟失的情況下運行。」 (C99)標準爲此包含stdint.h中的intptr_t。 –

+0

是的,它的確如此,但不能保證任何其他整數類型的信息都完整。當sizeof(void *)== 16'爲真(128位指針)時,不能可靠地說'int64_t'(對於那些MSVC人來說''__int64')將能夠保存'void *'的值。雖然這樣的系統可能只存在於理論中,但這種代碼不能被依賴。沒有什麼是面向未來的,但至少可以嘗試避免代碼破壞。 –

+0

對於無符號類型,如果'TYPE_MAX> = INTPTR_MAX'或'TYPE_MAX> = UINTPTR_MAX',或者更一般地(在運行時),如果sizeof(type)> = sizeof(其他整型)可以容易地保存這些信息void *)'。但是,如果您正在討論將數值數據存儲在'void *'中,您可以始終反轉測試,或者始終使用'(u)intptr_t'並讓隱式整數轉換處理任何潛在問題。 –