-
1 # TonyDeng
-
2 # 列炮緩開局
ArrayList的泛型功能,還是陣列長度自增功能?如果是泛型,那做不了,不支援!
如果是自增長度,Java裡是每add一次檢查一下陣列長度是否還有剩餘空間可用,如果不可用了,不夠長了,那就會新申請一個原來長度2倍的陣列,並把原來的數組裡的內容複製到新數組裡!
-
3 # 染指流年99211
c語言沒有這種容器,這種容器的本質是,當元素長度快達到陣列的上限時(具體達到上限的多少,每種語言都有設定),就給陣列擴容,申請更大容量的陣列。c語言也可以封裝成這樣的容器,不過c語言沒有類的概念,封裝起來比較麻煩,一般用結構體來粗略表示類,結構體中包含一個函式(檢測陣列實際元素長度,若超過容量的一半,執行擴容),陣列,陣列容量n
-
4 # 哈K的視角
在c語言中要用到,類似java中的ArrayList的功能,一般是怎麼做的?
1. 標準C肯定是沒有的,用第三方庫才能使用類似功能。
2. C++可以使用STL。
3. 可以自己實現一下C版本的ArrayList,畢竟Java物件可以轉為C結構體和成員指標,ArrayList本質也只是一個數組。
(注:C語言再規定合適的約束的前提下,也是可以面向物件程式設計的!)
一個簡單的C ArrayList的Demo實現1. 檔案結構:ArrayList.h:標頭檔案
ArrayList.c:實現標頭檔案中的功能
ArrayListTest.c:測試
2.ArrayList.h
標頭檔案的基本框架:
#ifndef _ARRAYLIST_H#define _ARRAYLIST_H// 標頭檔案體#endif標頭檔案中應包含結構體定義,必要的宏定義,需要直接在其他檔案中使用的函式的定義。
Java中的ArrayList是實現引用的陣列,而不是物件的陣列,在連續的儲存空間中存放的是引用,而不是物件實體,所以在實現的時候採用void**,那麼這樣實現的ArrayList將可以含有任意型別的變數,壞處就是需要在使用的時候人為的解析。
capacity是當前item_list申請的長度。
my_size是當前item_list中存放了多少個元素。之所以不用size是為了和接下來實現的size函式區別。
為實現透過結構體透過呼叫成員的方式呼叫函式,而不是直接透過函式名呼叫函式。在結構體中宣告函式指標用以呼叫函式。這樣就可以在ArrayList.c中將函式的作用域宣告為只有本檔案可見,避免和其他庫函式函式名衝突。但是因為結構體中包含這個檔案中函式的指標,仍然可以呼叫函式。
typedef struct ArrayList ArrayList;struct ArrayList{ void** item_list; int capacity; int my_size; // 函式指標}為實現函式指標的賦值,需要宣告初始化函式,在初始化函式中將函式指標賦值,所以這兩個函式就不能放到結構體中:
// create a new ArrayListint init_ArrayList(ArrayList*);// create a new ArrayList with specified capacityint init_ArrayList_capacity(ArrayList*,int capacity);3.ArrayList.c
包含標頭檔案,實現函式
因為這些函式無法知道是哪個結構體呼叫自己的,所以都需要將呼叫的結構體傳進去。
4.ArrayListTest.c
包含標頭檔案
呼叫的方式類似:
al.retainAll(&al,aap+3,11);al.trimToSize(&al);
由於篇幅有限,完整的實現請參照Github倉庫的簡易demo:C-Wheel-ArrayList
-
5 # 光明右使8787
兩個途徑:
1、自力更生,自己造一個,list就是連結串列。
2、去開源專案中挖一個。大部分開源專案都有list演算法。
C靠積累,寫得多了就有了自己的庫。
-
6 # 大學生程式設計指南
計科專業從事嵌入式開發已經多年了,對於C語言用的比較多,java相關的專案也做過幾個,在具體的專案中如果採用C語言的編寫,在實現具體的應用功能的時候消耗的程式碼量相對比較多,而且很多像java中的集合或者佇列的概念,這些基本的工具都需要自己去實現,而且一旦實現的存在問題還會導致系統的崩潰或者記憶體洩漏,一般來講做過C語言做過專案,每次實現應用級開發的時候需要涉及到新的功能模組可能需要實現的程式碼不僅僅是業務模組的程式碼了。
相對來講如果是java層面的程式碼,開源的類庫和標準的庫非常多,所以在編寫業務模組程式碼上還快於底層的程式語言,所以從語言的性質考慮底層的程式語言還是適合在底層做支架類的事情,高階語言去做應用級別的開發,因為應用開發來講變化比較多,涉及到的範圍也比較廣泛,但是高階語言本身自帶的或者開源的類庫多如牛毛,所以在應對使用者需求的時候更加靈活自如,任何一種程式語言都有其優勢點,程式語言雖然種類繁多,但是每種程式語言只是在自己適合的場景出現,這樣程式設計的效率還會極大的增強。
早期的程式設計效率要比現在還是低很多,早期的程式語言的種類也比現在少,而且基本上採用底層的程式語言去開發應用,不僅僅效率低還非常容易造成系統的崩潰,現在應用開發可以選擇的開發語言非常多,所以早期的底層開發語言已經慢慢在應用端沒有市場了,這也是科技發展的必然趨勢,分工變得越來越明細化,合適的人做合適的事情。
目前市場的狀態是C/C++底層程式語言在市場絕對工作數量並不低,但是相對比例在下降,畢竟大部分的企業還是應用級別的開發為主,能夠大規模的搞底層開發的企業畢竟屬於有實力的企業,現在國內程式設計應用級別的開發主要是網際網路企業,對於像java,python,php之類用的比較多,但並不是意味著像C語言之類的底層語言就不重要了,就拿現在比較火熱的人工智慧來講底層框架的構建還是離不開C/C++,畢竟像複雜的演算法效能的要求是比較高的,雖然高階語言也能去做但在效能上還是抵不住底層程式語言。
回覆列表
不熟悉Java的功能,C#類似的知道,用C也可以仿的。這個模擬的動態陣列,用C語言實現,並不難,涉及語言特性和多執行緒的,沒必要自找麻煩去實現完整。高效的解決方案,是直接使用C++做編譯器,寫的基本上是C程式碼,到相關部分就直接使用C++標凖庫即可——兩者的本質區別是程式設計思想不是語法,用C++編譯器寫C程式無妨的。