P基本概念
set插入時(shí)會(huì)被自動(dòng)排序,底層結(jié)構(gòu)是二叉樹(shù)實(shí)現(xiàn)。區(qū)別是set不允許有重復(fù)元素,而mulitset允許
兩者共用一個(gè)頭文件<set>
構(gòu)造和賦值

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

如上,我們使用set給插入降序,結(jié)果出來(lái)卻是升序的,注意迭代器還可以使用begin,end獲取,但是不能使用<,為了好記,一般迭代器都建議使用!=
set容器是去重的,我們可以插入重復(fù)的值,但是只有一個(gè)
大小和交換

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

插入和刪除

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

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

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

如上,代碼是沒(méi)什么說(shuō)的
set和multiset區(qū)別

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

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

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

當(dāng)然multiset就不用了,因?yàn)槠渲环祷氐鲗?duì)象,所以不用判斷是否成功,重復(fù)也可以往里插
pair對(duì)組
上節(jié)課我們使用set的insert方法返回的是pair對(duì)組

這次我們好好研究下,其創(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ì)象

如上,方法調(diào)用沒(méi)什么說(shuō)的,相當(dāng)于python的二元組
set容器排序
我們知道set默認(rèn)的排序是升序的,如果我們想修改其為降序存儲(chǔ),就需要使用仿函數(shù)

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

如上,其實(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ō)的了

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

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