C 中的一些集合類

2021-08-04 13:27:56 字數 3061 閱讀 8413

1.array 陣列,

用於儲存一組資料,建立陣列需要明確陣列儲存的型別及長度,一旦確定不可改變,沒有方便的新增,刪除,查詢方法。

特點:根據下標(索引)查詢速度非常快,

時間複雜度:(增加:o(n),刪除:o(n/2), 修改(n/2) 查詢: o(1) )

2.arraylist 動態陣列,

可以根據元素個數的多少進行長度變化,可以儲存任意型別,並且自身已經具備了常用的操作方法,add(),remove(),insert(),indexof(), 在讀取,儲存的過程中會涉及到裝箱拆箱效率不高,

3.stack 棧

棧是一種特殊的資料型別,先儲存的元素最後被使用,這種操作通常稱為先進後出(filo),通常的操作只有兩種,分別是入棧(壓棧),出棧。兩種操作的元素都在棧頂,

4 queue 佇列

佇列是一種先進先出的資料型別,常用操作有兩種,分別是入列出列,入列元素新增到隊尾,出列的元素從隊頭取出

5.hashtable 雜湊表

是一種通過乙個『 鍵 』對應乙個 『值』 的形式進行資料儲存,類似陣列的下標訪問,此時的下標可以自定義,

hashset(不重複的無序列表) , linkedlist(),sortedset(不重複的有序列表) 掌握儲存方式, 常用方法

hashset對集合運算的操作

hashset是乙個set集合,雖然list、collection也叫集合,但set集合和它們卻大有不同。

hashset提供了和「set集合運算」相關的方法,如:

intersectwith

(ienumerableother) (交集)

public void intersectwithtest() ;

hashsetset2 = new hashset() ;

set1.intersectwith(set2);

foreach (var item in set1)

//輸出:2,3 }

unionwith

(ienumerableother) (並集)

public void unionwithtest() ;

hashsetset2 = new hashset() ;

set1.unionwith(set2);

foreach (var item in set1)

//輸出:1,2,3,4 }

exceptwith

(ienumerableother) (排除)

public void exceptwithtest() ;

hashsetset2 = new hashset() ;

set1.exceptwith(set2);

foreach (var item in set1)

//輸出:1 }

這些對集合的操作是list、hashtable和dictionary所缺少的,但是伴隨著linq和擴充套件方法的出現,.net 3.5為泛型集合提供了一系列的擴充套件方法,使得所有的泛型集合具備了set集合操作的能力。

例如與hashset的intersectwith 方法對應的擴充套件方法是ienumerable的intersect,兩者的區別是:

hashset.intersectwith 是對當前集合進行修改,沒有返回值;

ienumerable.intersect並不修改原集合,而是返回了乙個新的集合。

例項**如下:

public void intersecttest() ;

hashsetset2 = new hashset() ;

ienumerableset3=set1.intersect(set2);

foreach (var item in set1)

foreach (var item in set3)

//輸出:o //set1 : 1,2,3 //set3 : 2,3 }

ienumerable其他的擴充套件方法也是一樣,都是不改變呼叫方法的陣列,而是產生並返回新的ienumerable介面型別的陣列,當然你可以通過toarray,tolist,todictionary將返回值轉換成你想要的集合型別。

至於如何使用這兩種集合操作方式,要取決於你的習慣和業務需求。

hashset的特點

在3.5之前,想用雜湊表來提高集合的查詢效率,只有hashtable和dictionary兩種選擇,而這兩種都是鍵-值方式的儲存。但有些時候,我們只需要其中乙個值,例如乙個email集合,如果用泛型雜湊表來儲存,往往要在key和value各儲存一次,不可避免的要造成記憶體浪費。而hashset只儲存乙個值,更加適合處理這種情況。

此外,hashset的add方法返回bool值,在新增資料時,如果發現集合中已經存在,則忽略這次操作,並返回false值。而hashtable和dictionary碰到重複新增的情況會直接丟擲錯誤。

hashset的不能做的事情

hashset是set集合,它只實現了icollection介面,在單獨元素訪問上,有很大的限制:

跟list相比,不能使用下標來訪問元素,如:list[1] 。

跟dictionary相比,不能通過鍵值來訪問元素,例如:dic[key],因為hashset每條資料只儲存一項,並不採用key-value的方式,換句話說,hashset中的key就是value,假如已經知道了key,也沒必要再查詢去獲取value,需要做的只是檢查值是否已存在。

所以剩下的僅僅是開頭提到的集合操作,這是它的缺點,也是特點。

總結

綜上可知,hashset是乙個set集合,查詢上有較大優勢,但無法通過下標方式來訪問單個元素,這點會讓用慣了list的人(我就是),用起來很不順手。

hashset有別於其他雜湊表,具有很多集合操作的方法,但優勢並不明顯,因為.net 3.5之後擴充套件方法賦予了泛型集合進行集合操作的能力,但擴充套件方法的集合操作往往返回新的集合,在使用習慣上,我個人更偏愛hashset的操作方式。

一些特殊的集合

1.stack集合 棧 stack,先進後出,乙個乙個賦值,乙個乙個取值,按順序。屬性和方法 count 取集合內元素的個數 push 將元素乙個乙個推入集合中 pop 將元素乙個乙個彈出集合 clear 清空集合 2.queue 佇列集合 先進先出,乙個乙個的賦值,乙個乙個的取值,按照順序。屬性和...

C 中,定義類(Class)的一些原則

1 定義類時,除非真的需要被其他類繼承,否則都用標記sealed,編譯器預設為非sealed 除非真的需要該accembly之外的類呼叫,否則都標記internal,除非特殊宣告,編譯器預設即為internal。2 類中的屬性 field 盡量定義為private,真的需要其繼承類呼叫時,盡量宣告為...

redis中set集合的一些用法

一.set型別 set是乙個集合,它是string型別的無序集合,set是通過hash table實現的,新增,刪除,查詢的時間複雜度都是o 1 對於集合我們可以取並集,交集,差集。通過這些操作我們可以實現sns中好友推薦和blog的tag功能。set常見操作 1 sadd 向乙個集合中新增乙個元素...