08--STL關聯容器(set/multiset)
阿新 • • 發佈:2019-04-29
clear size 等號 叠代器 empty -s 查找 刪除 最後一個元素
一:set/multiset的簡介
set是一個集合容器,其中所包含的元素是唯一的,集合中的元素按一定的順序排列。元素插入過程是按排序規則插入,所以不能指定插入位置。
set采用紅黑樹變體的數據結構實現,紅黑樹屬於平衡二叉樹。在插入操作和刪除操作上比vector快。
set不可以直接存取元素。(不可以使用at.(pos)與[]操作符)。
multiset與set的區別:
set支持唯一鍵值,每個元素值只能出現一次;而multiset中同一值可以出現多次。
修改值時需註意:
不可以直接修改set或multiset容器中的元素值,因為該類容器是自動排序的。
如果希望修改一個元素值,必須先刪除原有的元素,再插入新的元素。
二:set/multiset對象的默認構造
set<int> setInt; //一個存放int的set容器。 set<float> setFloat; //一個存放float的set容器。 set<string> setString; //一個存放string的set容器。
multiset<int> mulsetInt; //一個存放int的multi set容器。 multiset<float> multisetFloat; //一個存放float的multi set容器。multiset<string> multisetString; //一個存放string的multi set容器。
三:set對象的拷貝構造和賦值
set(const set &st); //拷貝構造函數 set& operator=(const set &st); //重載等號操作符 set.swap(st); //交換兩個集合容器
四:Set集合的元素排序
set<int,less<int>> setIntA; //該容器是按升序方式排列元素。從小到大 //默認升序排序 set<int> setIntA set<int,greater<int>> setIntB; //該容器是按降序方式排列元素。從大到小
less<int>與greater<int>中的int可以改成其它類型,該類型主要要跟set容納的數據類型一致。
五:set對象的插入
set.insert(elem); //在容器中插入元素。
六:set對象的叠代相關函數
set.begin(); //返回容器中第一個數據的叠代器。 set.end(); //返回容器中最後一個數據之後的叠代器。 set.rbegin(); //返回容器中倒數第一個元素的叠代器。 set.rend(); //返回容器中倒數最後一個元素的後面的叠代器。
七:set大小
set.size(); //返回容器中元素的數目 set.empty();//判斷容器是否為
八:set的刪除
set.clear(); //清除所有元素 set.erase(pos); //刪除pos叠代器所指的元素,返回下一個元素的叠代器。 set.erase(beg,end); //刪除區間[beg,end)的所有元素 ,返回下一個元素的叠代器。 set.erase(elem); //刪除容器中值為elem的元素。
九:set的查找
set.find(elem); //查找elem元素,返回指向elem元素的叠代器。 set.count(elem); //返回容器中值為elem的元素個數。對set來說,要麽是0,要麽是1。對multiset來說,值可能大於1。 set.lower_bound(elem); //返回第一個>=elem元素的叠代器。 set.upper_bound(elem); // 返回第一個>elem元素的叠代器。 set.equal_range(elem); //返回容器中與elem相等的上下限的兩個叠代器。上限是閉區間,下限是開區間,如[beg,end)。
由於equal_range返回兩個叠代器,而且這兩個叠代器被封裝在pair中。下面介紹對組pair
十:補充pair對組
(一)使用案例
pair< set<int>::iterator, set<int>::iterator >pairIt = setInt.equal_range(ele);
set裏面使用有點不太給力,因為全部排序了,獲取的數據全部是相同的
(二)pair含義
pair譯為對組,可以將兩個值視為一個單元。
pair<T1,T2>存放的兩個值的類型,可以不一樣,如T1為int,T2為float。T1,T2也可以是自定義類型。
pair.first是pair裏面的第一個值,是T1類型。
pair.second是pair裏面的第二個值,是T2類型。
十一:使用案例
void main() { int r; srand(time(NULL)); multiset<int> iset; for (int i = 1; i < 10; i++) { r = rand() % 7; cout << r << " "; iset.insert(r); } cout << endl; for (multiset<int>::iterator iter = iset.begin(); iter != iset.end();iter++) { cout << *iter << " "; } cout << endl; pair<multiset<int>::iterator,multiset<int>::iterator> pis=iset.equal_range(5); multiset<int>::iterator first = pis.first; multiset<int>::iterator second = pis.second; for (; first != second;first++) { cout << *first << " "; } cout << endl; system("pause"); }
08--STL關聯容器(set/multiset)