c 資料結構 multiset

2021-10-03 15:03:15 字數 2706 閱讀 5085

簡單應用:

通過乙個程式來看如何使用multiset:

放入自定義型別的資料:

不只是int型別,multiset還可以儲存其他的型別諸如 string型別,結構(struct或class)型別。而我們一般在程式設計當中遇到的問題經常用到自定義的型別,即struct或class。例如下面的例子:

struct rec;

multiseth;

不過以上的**是沒有任何用處的,因為multiset並不知道如何去比較乙個自定義的型別。怎麼辦呢?我們可以定義multiset裡面rec型別變數之間的小於關係的含義(這裡以x為第一關鍵字為例),具體過程如下:

定義乙個比較類cmp,cmp內部的operator函式的作用是比較rec型別a和b的大小(以x為第一關鍵字,y為第二關鍵字):

struct cmp;

struct cmp{

bool operator()(const rec&a,const rec&b){

return a.xh;

通過以上**,能夠建立乙個集合h使得該集合能夠儲存和排序自定義型別

常用函式總結:

構造、拷貝、析構

操作效果

set c

產生乙個空的set/multiset,不含任何元素

set c(op)

以op為排序準則,產生乙個空的set/multiset

set c1(c2)

產生某個set/multiset的副本,所有元素都被拷貝

set c(beg,end)

以區間[beg,end)內的所有元素產生乙個set/multiset

set c(beg,end, op)

以op為排序準則,區間[beg,end)內的元素產生乙個set/multiset

c.~set()

銷毀所有元素,釋放記憶體

set產生乙個set,以(operator <)為排序準則

set產生乙個set,以op為排序準則

非變動性操作

操作效果

c.size()

返回當前的元素數量

c.empty ()

判斷大小是否為零,等同於0 == size(),效率更高

c.max_size()

返回能容納的元素最大數量

c1 == c2

判斷c1是否等於c2

c1 != c2

判斷c1是否不等於c2(等同於!(c1==c2))

c1 < c2

判斷c1是否小於c2

c1 > c2

判斷c1是否大於c2

c1 <= c2

判斷c1是否小於等於c2(等同於!(c2c1 >= c2

判斷c1是否大於等於c2 (等同於!(c1特殊的搜尋函式

sets和multisets在元素快速搜尋方面做了優化設計,提供了特殊的搜尋函式,所以應優先使用這些搜尋函式,可獲得對數複雜度,而非stl的線性複雜度。比如在1000個元素搜尋,對數複雜度平均十次,而線性複雜度平均需要500次。

操作效果

count (elem)

返回元素值為elem的個數

find(elem)

返回元素值為elem的第乙個元素,如果沒有返回end()

lower _bound(elem)

返回元素值為elem的第乙個可安插位置,也就是元素值 >= elem的第乙個元素位置

upper _bound (elem)

返回元素值為elem的最後乙個可安插位置,也就是元素值 > elem 的第乙個元素位置

equal_range (elem)

返回elem可安插的第乙個位置和最後乙個位置,也就是元素值==elem的區間

賦值操作

效果c1 = c2

將c2的元素全部給c1

c1.swap(c2)

將c1和c2 的元素互換

swap(c1,c2)

同上,全域性函式

迭代器相關函式

sets和multisets的迭代器是雙向迭代器,對迭代器操作而言,所有的元素都被視為常數,可以確保你不會人為改變元素值,從而打亂既定順序,所以無法呼叫變動性演算法,如remove()。

操作效果

c.begin()

返回乙個隨機訪問迭代器,指向第乙個元素

c.end()

返回乙個隨機訪問迭代器,指向最後乙個元素的下乙個位置

c.rbegin()

返回乙個逆向迭代器,指向逆向迭代的第乙個元素

c.rend()

返回乙個逆向迭代器,指向逆向迭代的最後乙個元素的下乙個位置

安插和刪除元素

必須保證引數有效,迭代器必須指向有效位置,序列起點不能位於終點之後,不能從空容器刪除元素。

操作效果

c.insert(elem)

插入乙個elem副本,返回新元素位置,無論插入成功與否。

c.insert(pos, elem)

安插乙個elem元素副本,返回新元素位置,pos為收索起點,提公升插入速度。

c.insert(beg,end)

將區間[beg,end)所有的元素安插到c,無返回值。

c.erase(elem)

刪除與elem相等的所有元素,返回被移除的元素個數。

c.erase(pos)

移除迭代器pos所指位置元素,無返回值。

c.erase(beg,end)

移除區間[beg,end)所有元素,無返回值。

c.clear()

C 資料結構

c 中實現通用資料結構 在程式設計當中經常會出現使用同種資料結構的不同例項的情況。例如 在乙個 程式中可以使用多個佇列 樹 圖等結構來組織資料。同種結構的不同例項,也 許只在資料元素的型別或數量上略有差異,如果對每個例項都重新定義,則非常麻 煩且容易出錯。那麼能否對同種型別資料結構僅定義一次呢?答案...

資料結構 C

本文將根據自己對資料結構的理解,介紹資料結構的基本型別 鍊錶。寫的不好的地方歡迎指正。首先是單鏈表。結點資料結構定義 struct node return false 3 刪除元素 bool delete node first,int x 現在介紹雙鏈表 首先也是結點結構定義 struct node...

C 資料結構

c c 陣列允許定義可儲存相同型別資料項的變數,但是結構是 c 中另一種使用者自定義的可用的資料型別,它允許您儲存不同型別的資料項。結構用於表示一條記錄,假設您想要跟蹤圖書館中書本的動態,您可能需要跟蹤每本書的下列屬性 為了定義結構,您必須使用struct語句。struct 語句定義了乙個包含多個成...