分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!
gnome
是基於gtk+
開發的一套桌面環境,gnome
和kde
作為兩大最流行的桌面環境,在全世界廣泛使用。只要是在linux
下工作的開發人員,對於gtk+
一定不陌生。而對於glib
,這個gtk+
下的無名英雄,其功能強大卻鮮為人知。今天,在這裡簡要介紹一下,如果你是開發人員,看完本文,相信你會愛上它的。
glib
不是gllibc
,儘管兩者都是基於(l)gpl
的開源軟體。但這一字之差卻誤之千里,glibc
是gnu
實現的一套標準c
的庫函式,而glib
是gtk+
的一套函式庫。在linux
平台上,像其它任何軟體一樣,glib
依賴於glibc。
glib
不是乙個學院派的東西,也不是憑空想出來的,完全是在開發gtk+
的過程中,慢慢總結和完善的結果。如果你是乙個工作3
年以上的c
,你會發現,很多苦惱已不再成其為苦惱,glib
裡很多東西正是你期望已經久的。
gobject
是glib
的精粹,glib
是用c實現的,但在很大程式是基於物件導向思想設計的,gobject
是所有類的基類。signal
在其中也是一大特色,signal
與作業系統中的signal
並不一樣,它是類似訊息一樣的東西,讓訊息在各個物件間傳遞,但盡量降低物件間的耦合。仔細讀一下它的**,唯一想說的話就是「絕!」。
動態陣列、鍊錶、雜湊表等通用容器,在不同的公司,在不同的時期,在不同的情況下,我們每個人對每一種容器,可能都實現過n
次以上。甚至在同乙個專案裡,出現幾份鍊錶的實現,也並非罕見。一直在抱怨,標準c
中為什麼沒有類似於stl
的標準容器,讓全世界的程式設計師在數以萬次的重複實現它們。不過,還算走運,有了glib
,惡夢在此終結了。glib
提供了動態陣列、單/
雙向鍊錶、雜湊表、多叉樹、平衡二叉樹、字串等常用容器,完全是物件導向設計的,實現得非常精緻。不用白不用,別客氣了。
你開發過跨硬體平台的軟體嗎?是不是常常為硬體平台的差異而苦惱呢?位元組順序是常見的問題之一,大端格式,小端格式,還是pdp
格式的?這樣差異造成的bug
會浪費不少時間,同時讓**晦澀難讀。glib
提供了一套完整的巨集,利用這些巨集編寫程式,問題大大簡化了。
你開發過跨作業系統的軟體嗎?在不同的平台下,很多函式有相同的功能,但函式原型,返回值差異巨大,也有的貌合神離,相同的名稱有著不同的意義,請看下面這張清單:
動態庫載入函式
執行緒函式
訊號量函式
互斥鎖函式
事件函式
字符集轉換函式
原子操作函式
建立程序函式
時間格式
io函式
為完成相同的功能,你卻要為此寫出不同的**。那怕只是乙個簡單的封裝,這麼多,你煩不煩?用glib
吧,它的作者們都是高手中的高手,對不同的平台的理解程度,遠遠超出你和我,而且這些程式經過大量的應用程式測試,已經非常的穩定了,放心的用吧。
你寫過讀取配置檔案的模組吧,像讀取ini
這樣簡單格式的檔案,當然不在話下,要讀markup
語言格式的配置檔案,難度可能大了點,雖然不是不可能,但除非是為了學習,何必自己找麻煩呢。glib
裡提供了詞法分析、markup
語言解析、ini
檔案訪問等功能,你完全不用為此擔憂。
不管是命令列程式,還是gui
程式,或者後台服務程序,通過命令引數來控制程式的行為,都是開發人員慣用的手法。從命令列引數取到有用的資訊,不難,遍歷一遍不就行了嗎?但在每個程式中都來遍一次,你不覺得很單調嗎?我們的時間很寶貴,浪費時間做這種事情,不值得吧。glib
的作者們早考慮到了,它提供了這樣的功能,你呼叫的它的函式,可能輕鬆的取得所要的命令列引數。
對於正規表示式,win32
下的開發人員可能用得少一點,而在linux
下的shell
裡,它卻是不可或缺之物。有沒有想到在自己的程式中使用的它呢,在有的情況下,使用正規表示式,可能會大大降低開發的難度,提高易用性。glib
也想到了這一點,它提供了簡單的正規表示式功能,當然,用與不用完全取決於你自己。
在程式裡,如果程式出錯了,特別是調了不該呼叫的函式,你是不是很想知道是誰調了它?大多數時候用debuger
是最好的選擇,在某些情況下,沒有debuger
可用,或者在debuger
裡重現不了這個問題,你會不會覺得很無助?別怕,glib
提供了一套跨平台的backtrace
函式,有了它,你可以很容易找到元凶了。
如果讀過一些大型的開源專案,你會發現,差不多每個專案都有一套自己的log
函式,用於記錄程式執行的除錯或者審計資訊。也有可能,你自己都曾在不同的專案裡實現過好幾次這個功能,第一次實現會覺得很好玩,會學到了一些東西,後來就會發現自己在做無用功。重複就是浪費,重複就是犯罪,glib
想到了這一點,它實現了一套完整的log
產生質數的演算法不難,在我們的程式裡也像是星外來客,很少使用,常常忽略了它。所謂書到用時方恨少,有這樣的東東,說不定就有用得到它的時候。glib
提供了這樣的功能,同時還提供了乙個較好的隨機數演算法。
linux shell
裡的自動補完功能很好用吧,從linux
轉移到win32
下工作的開發人員,常常抱怨win32
的shell
裡沒有這個功能,其實win32
下也是有的,把登錄檔裡的乙個選項開啟就行了。不管怎麼樣,總之這個功能太有用了,沒有它,你都會覺得少了點什麼,全身不自在,glib
裡連這個功能都提供了,是不是很人性化呢?
記憶體問題!還是記憶體問題!如果你沒有為記憶體問題而苦惱過,我都懷疑你是不是乙個真正的c
語言程式設計師。記憶體洩露、訪問越界、空指標、野指標和記憶體優化等問題,是不是都曾讓你夜不能昧?有些工具可以幫助你,但這不是萬能的良藥,好好寫你的程式才是第一要義。glib
提供了一些的手段,也可以在一定程度上減輕你的痛苦。
給我老師的人工智慧教程打call!
glib 惡夢終結者
g nome是基於gtk 開發的一套桌面環境,gnome和kde作為兩大最流行的桌面環境,在全世界廣泛使用。只要是在linux下工作的開發人員,對於gtk 一定不陌生。而對於glib,這個gtk 下的無名英雄,其功能強大卻鮮為人知。今天,在這裡簡要介紹一下,如果你是開發人員,看完本文,相信你會愛上它...
序列終結者
時間限制 1 sec 記憶體限制 128 mb 題目描述 給定乙個長度為n的序列,每個序列的元素是乙個整數。要支援以下三種操作 1.將 l,r 這個區間內的所有數加上v。2.將 l,r 這個區間翻轉,比如1 2 3 4變成4 3 2 1。3.求 l,r 這個區間中的最大值。最開始所有元素都是0。輸入...
序列終結者 Splay
1.注意在 split 和 merge 時要特判一下邊界,否則就會出現邊界錯誤的情況。2.隨時都要維護父指標。3.在更新 maxv 和翻轉標記時要判一下左右兒子是否都存在。include include includeusing namespace std const int maxn 100000...