日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

C++ STL之Set

發(fā)布時(shí)間:2023/11/30 c/c++ 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ STL之Set 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

set是關(guān)聯(lián)容器,類似于集合。

特點(diǎn)是里面的元素不會(huì)重復(fù),而且元素時(shí)有序的。

1.聲明定義:

#include<set>using namespace std;set<int> s;

2.常見(jiàn)用法

s.inert(5); //插入 s.begin(); //返回s的第一個(gè)元素 s.end(); // 返回最后一個(gè)元素 s.clear() ; //清空 s.empty(); //判斷是否為空 s.max_size() //返回最可能包含的元素最大個(gè)數(shù) s.size(); //返回當(dāng)前元素的個(gè)數(shù) s.rbegin(); //同end() s.rend(); // 同begin() s.equal_range(); //返回集合中與給定值相等的上下限兩個(gè)迭代器 s.erase(); //刪除集合中的元素 s.lower_bound //返回大于或等于某值的第一個(gè)元素迭代器 s.key_comp(); //返回一個(gè)用于中間值比較的函數(shù) s.upper_bound //返回大于的第一個(gè)元素迭代器

3.自定義比較函數(shù)

1)元素不是結(jié)構(gòu)體:(自定義比較函數(shù)myComp,重載“()”操作符)

struct myComp{bool operator() (const your_type &a,const your_type &b){return a.data - b.data > 0;} }

2)如果元素是結(jié)構(gòu)體

struct Info{string name;int score;bool operator<const Info &a) const{return a.score < score;} }

---------------------------------------------------------------------------------------------

補(bǔ)充:

C++容器分為順序容器和關(guān)聯(lián)性容器:

? ? 順序容器包括vector、deque、list、forward_list、array、string,所有順序容器都提供了快速順序訪問(wèn)元素的能力。

? ? 關(guān)聯(lián)容器包括set、map的關(guān)聯(lián)型容器和順序容器有著根本的不同:關(guān)聯(lián)容器中的元素是按關(guān)鍵字來(lái)保存和訪問(wèn)的。

? ? 關(guān)聯(lián)容器不支持順序容器的位置相關(guān)的操作。原因是關(guān)聯(lián)容器中元素是根據(jù)關(guān)鍵字存儲(chǔ)的,這些操作對(duì)關(guān)聯(lián)容器沒(méi)有意義。

而且,關(guān)聯(lián)容器也不支持構(gòu)造函數(shù)或插入操作這些接受一個(gè)元素值和一個(gè)數(shù)量值得操作。

? ? 關(guān)聯(lián)容器支持高效的關(guān)鍵字查找和訪問(wèn)

? ??map中的元素是一些關(guān)鍵字----值(key--value)對(duì):關(guān)鍵字起到索引的作用,值則表示與索引相關(guān)聯(lián)的數(shù)據(jù)。

? ??set中每個(gè)元素只包含一個(gè)關(guān)鍵字:set支持高效的關(guān)鍵字查詢操作----檢查一個(gè)給定關(guān)鍵字是否在set中。

? ??set封裝的二叉樹(shù),所以它支持插入數(shù)據(jù)的排序,它是關(guān)聯(lián)式容器,存儲(chǔ)同一數(shù)據(jù)類型,set中的每一個(gè)元素都是唯一的,系統(tǒng)會(huì)根據(jù)元素的值自動(dòng)進(jìn)行排序。

? ? 它們內(nèi)部采用的是平衡檢索二叉樹(shù):紅黑樹(shù),它的統(tǒng)計(jì)性能要好于一般的平衡二叉樹(shù)。

1)map和set的插入刪除效率要比其他序列容器高

? ? 對(duì)于關(guān)聯(lián)容器來(lái)說(shuō),不需要內(nèi)存拷貝和移動(dòng)。

? ? set容器所有元素都是以節(jié)點(diǎn)的方式來(lái)存儲(chǔ),節(jié)點(diǎn)結(jié)構(gòu)和鏈表相似,指向父節(jié)點(diǎn)和子節(jié)點(diǎn)。插入和刪除的時(shí)候改變的都是指針,不會(huì)移動(dòng)內(nèi)存。

2)每次insert之后,以前保存的iterator不會(huì)失效。

? ? iterator等價(jià)于指向節(jié)點(diǎn)的指針,其內(nèi)存沒(méi)有發(fā)生變化,指向內(nèi)存的指針也不會(huì)出現(xiàn)失效的情況。

? ? 對(duì)于vector來(lái)說(shuō),每一次插入和刪除都有可能使指針失效,即使在尾部插入也是 如此。

? ? 這是因?yàn)闉榱吮WC內(nèi)部數(shù)據(jù)的連續(xù)存放,iterator指向的那塊內(nèi)存在刪除和插入的過(guò)程可能已經(jīng)被其他內(nèi)存覆蓋和釋放了。

? ? 即使是用push_back的時(shí)候,容器的存儲(chǔ)空間可能不夠,需要一塊更大的內(nèi)存。

? ? 只有把以前的內(nèi)存釋放掉,申請(qǐng)更大的內(nèi)存,復(fù)制已有的數(shù)據(jù)元素到新的內(nèi)存,最后把需要插入的元素放到最后。

? ?那么以前的內(nèi)存指針必然不可再用了。

3)當(dāng)元素增多的時(shí)候,set的插入和搜索速度變化是不變的。? ?紅黑樹(shù)的查找時(shí)間復(fù)雜度都是logN。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

未完待續(xù)

?

轉(zhuǎn)載于:https://www.cnblogs.com/wanghao-boke/p/10483967.html

總結(jié)

以上是生活随笔為你收集整理的C++ STL之Set的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。