30 STL(八)set/multiset容器

P基本概念

set插入時(shí)會(huì)被自動(dòng)排序,底層結(jié)構(gòu)是二叉樹(shù)實(shí)現(xiàn)。區(qū)別是set不允許有重復(fù)元素,而mulitset允許

兩者共用一個(gè)頭文件<set>

構(gòu)造和賦值

1

構(gòu)造一個(gè)是默認(rèn)構(gòu)造,一個(gè)是拷貝構(gòu)造,賦值是=重載的操作符,set沒(méi)有push類(lèi)方法只有insert(val)方法,而且自動(dòng)排序,無(wú)pos可言

2

如上,我們使用set給插入降序,結(jié)果出來(lái)卻是升序的,注意迭代器還可以使用begin,end獲取,但是不能使用<,為了好記,一般迭代器都建議使用!=

set容器是去重的,我們可以插入重復(fù)的值,但是只有一個(gè)

大小和交換

3

如上,方法很簡(jiǎn)單,不允許重新指定大小

4

插入和刪除

5

如上,插入和刪除只有insert和erase,clear實(shí)現(xiàn)清空

6

如上,我們實(shí)現(xiàn)了各種方法,當(dāng)然set也有erase刪除所有重復(fù)元素的方法,當(dāng)然對(duì)于set就是刪除對(duì)應(yīng)元素,對(duì)于multiset就是刪除所有元素

查找和統(tǒng)計(jì)

7

如上,查找find返回迭代器指針,count對(duì)于set來(lái)說(shuō)就是0,1,如果是multiset可以用于統(tǒng)計(jì)重復(fù)元素的個(gè)數(shù)

8

如上,代碼是沒(méi)什么說(shuō)的

set和multiset區(qū)別

9

我們之前使用insert給set插入數(shù)據(jù),其實(shí)是有返回值的,如上,我們可以看到內(nèi)容,返回的是_Pairib對(duì)象

10

而其我們查看定義其實(shí)是個(gè)pair對(duì)象,由迭代器和bool值來(lái)返回,其中bool值用于返回是否插入成功

11

如上,我們使用pair類(lèi)型去接收,其可以使用second屬性(不是方法)獲得到bool值,當(dāng)然我們也可以用int接收,可以看到結(jié)果是第一次可以insert成功,第二次就不可以了、

12

當(dāng)然multiset就不用了,因?yàn)槠渲环祷氐鲗?duì)象,所以不用判斷是否成功,重復(fù)也可以往里插

pair對(duì)組

上節(jié)課我們使用set的insert方法返回的是pair對(duì)組

13

這次我們好好研究下,其創(chuàng)建方法如上2種,注意格式,pair對(duì)象,指定模板的2個(gè)對(duì)象類(lèi)型,變量名然后小括號(hào)里面給初始值,另一種是使用make_pair方法傳入2個(gè)值給pair對(duì)象初始化,我們可以使用p對(duì)象的first,second屬性來(lái)獲得這2個(gè)屬性對(duì)象

14

如上,方法調(diào)用沒(méi)什么說(shuō)的,相當(dāng)于python的二元組

set容器排序

我們知道set默認(rèn)的排序是升序的,如果我們想修改其為降序存儲(chǔ),就需要使用仿函數(shù)

15

如上,我們先正常輸出,其實(shí)升序的;

16

如上,其實(shí)現(xiàn)是使用構(gòu)造的重載,指定默認(rèn)的排序器,這里排序器我們使用了仿函數(shù),本質(zhì)就是重載了()方法的類(lèi),可以將類(lèi)實(shí)現(xiàn)調(diào)用當(dāng)函數(shù)使用,(類(lèi)似python實(shí)現(xiàn)__call__),別的就沒(méi)什么說(shuō)的了

17

仿函數(shù)有什么作用呢,如果我們insert自定義類(lèi)型,set就不會(huì)識(shí)別該按什么排序了,就需要我們使用自定義仿函數(shù)規(guī)則

18

如上,就是自定義了個(gè)仿函數(shù),其實(shí)也沒(méi)什么可說(shuō)的

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • STL(標(biāo)準(zhǔn)模板庫(kù)),是目前C++內(nèi)置支持的library。它的底層利用了C++類(lèi)模板和函數(shù)模板的機(jī)制,由三大部分...
    歲與禾閱讀 39,394評(píng)論 3 132
  • 一. 順序容器: 按順序存儲(chǔ)數(shù)據(jù); 插入速度快,查找相對(duì)較慢。 vector 在最后插入數(shù)據(jù);STLvector類(lèi)...
    BookThief閱讀 2,060評(píng)論 0 4
  • Vector 動(dòng)態(tài)數(shù)據(jù),可以隨機(jī)訪問(wèn)。末尾添加和刪除的效率高。元素的順序和推入的順序一致。 基本函數(shù) push_b...
    第八區(qū)閱讀 839評(píng)論 0 0
  • c++容器list、vector、map、set區(qū)別 list 封裝鏈表,以鏈表形式實(shí)現(xiàn),不支持[]運(yùn)算符。 對(duì)隨...
    潘雪雯閱讀 2,228評(píng)論 1 2
  • 久違的晴天,家長(zhǎng)會(huì)。 家長(zhǎng)大會(huì)開(kāi)好到教室時(shí),離放學(xué)已經(jīng)沒(méi)多少時(shí)間了。班主任說(shuō)已經(jīng)安排了三個(gè)家長(zhǎng)分享經(jīng)驗(yàn)。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,810評(píng)論 16 22

友情鏈接更多精彩內(nèi)容