1. 簡(jiǎn)介
Set(集合)屬于關(guān)聯(lián)式容器,也是STL中最實(shí)用的容器,關(guān)聯(lián)式容器依據(jù)特定的排序準(zhǔn)則,自動(dòng)為其元素排序。Set集合的底層使用一顆紅黑樹(可能讀者對(duì)此不太了解,等但學(xué)到樹論與圖論的章節(jié)的時(shí)候就會(huì)明白原因),其屬于一種非線性的數(shù)據(jù)結(jié)構(gòu),每一次插入數(shù)據(jù)都會(huì)自動(dòng)進(jìn)行排序,注意,不是需要排序時(shí)再排序,而是每一次插入數(shù)據(jù)的時(shí)候其都會(huì)自動(dòng)進(jìn)行排序。因此,Set中的元素總是順序的。
Set的性質(zhì)有:數(shù)據(jù)自動(dòng)進(jìn)行排序且數(shù)據(jù)唯一,是一種集合元素,允許進(jìn)行數(shù)學(xué)上的集合相關(guān)的操作。
2. 相關(guān)頭文件
頭文件:#include<set>
3. 初始化
初始化格式:
template < class T, class Compare = less<T>, class Alloc = allocator<T> > class set;
基本上就是三個(gè)參數(shù),第一個(gè)是值,第二個(gè)比較器,用于比較內(nèi)容,默認(rèn)為less<Key>即降序,第三個(gè)是內(nèi)存配置器,負(fù)責(zé)內(nèi)存的分配和銷毀。
在實(shí)際使用中,我們僅僅為其分配值就足以滿足大部分需求。
set<int> s; //直接指定值的類型創(chuàng)建,其他為默認(rèn)方法 //其余方法與前文的創(chuàng)建方法類似,不做具體展示……
4. 迭代器
C98標(biāo)準(zhǔn)下:
for (set<int>::iterator it=s.begin(); it!=s.end(); ++it) cout << *it << ' ';
這也是前文學(xué)過的標(biāo)準(zhǔn)用法,接下來,讓我們了解一個(gè)更加先進(jìn)和便捷的方法,auto方法迭代,這需要我們編譯器開啟C11標(biāo)準(zhǔn),每個(gè)編譯器的開啟標(biāo)準(zhǔn)不一,請(qǐng)具體情況具體分析。
C11標(biāo)準(zhǔn)下:
for (auto it=s.cbegin(); it!=s.cend(); ++it) cout << *it << ' ';
可見我們使用了auto進(jìn)行了迭代器類型的自動(dòng)識(shí)別,省去了我們的聲明迭代器的那一部分內(nèi)容,這使得代碼更加簡(jiǎn)化。
5. 常用接口
我們使用set<int> s 預(yù)先創(chuàng)建了一個(gè)集合,命名為s,方便舉例
a)大小size()
返回元素的個(gè)數(shù)
函數(shù)原型:size_type size() const;
cout<<s.size()<<endl; //直接返回元素個(gè)數(shù)
b) 插入元素insert()
插入一個(gè)元素,插入元素的類型必須與創(chuàng)建的容器類型一致
函數(shù)原型:pair<iterator,bool> insert (const value_type& val);
s.insert(i);
c)刪除元素erase()
刪除一個(gè)元素,或者是一段區(qū)間的元素,將會(huì)自動(dòng)縮減空間使用。
函數(shù)原型:
iterator erase (iterator position);
iterator erase (iterator first, iterator last);
使用方法:
s.erase(s.begin()); //使用迭代器的方法刪除第一個(gè)元素 s.erase(s.begin(),s.end()); //刪除一段內(nèi)容,這里是全部刪除
d)清空元素clear()
將整個(gè)set集合中的內(nèi)容清空,注意,這里只是清空元素,其所占用的最大內(nèi)存空間還是不會(huì)改變的。
s.clear();
e)查找元素find()
函數(shù)原型:iterator find (const value_type& val) const;
函數(shù)原型:iterator find (const value_type& val) const;
Find方法返回一個(gè)迭代器類型的指針,因此我們直接通過find獲取其數(shù)據(jù)的時(shí)候需要使用指針*的方式進(jìn)行表示,否則將會(huì)報(bào)錯(cuò)。
cout<< *s.find(4) <<endl;
或者 實(shí)現(xiàn)找到的刪除指定元素
s.erase(s.find(4));
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競(jìng)賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:
一點(diǎn)編程也不會(huì)寫的:零基礎(chǔ)C語言學(xué)練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進(jìn)階課程
從零到寫出一個(gè)爬蟲的Python編程課程
只會(huì)語法寫不出代碼?手把手帶你寫100個(gè)編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競(jìng)賽課入門課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程