1. 程式人生 > >08--STL關聯容器(set/multiset)

08--STL關聯容器(set/multiset)

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)