簡單應用:
通過乙個程式來看如何使用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 語句定義了乙個包含多個成...