C++ STL之Set
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)題。
- 上一篇: 英雄联盟中应该选择什么英雄 ?
- 下一篇: C/C++入门易错点及常用小技巧