亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++之set和multiset容器初學

2019-11-08 03:09:36
字體:
來源:轉載
供稿:網友

Set和multiset容器

set/multiset的簡介

set是一個集合容器,其中所包含的元素是唯一的,集合中的元素按一定的順序排列。元素插入過程是按排序規則插入,所以不能指定插入位置。

set采用紅黑樹變體的數據結構實現,紅黑樹屬于平衡二叉樹。在插入操作和刪除操作上比vector快。

set不可以直接存取元素。(不可以使用at.(pos)與[]操作符)。

 multiset與set的區別:set支持唯一鍵值,每個元素值只能出現一次;而multiset中同一值可以出現多次

 不可以直接修改set或multiset容器中的元素值,因為該類容器是自動排序的。如果希望修改一個元素值,必須先刪除原有的元素,再插入新的元素。

 #include <set>  

 

 

 

set/multiset對象的默認構造

set<int> setInt;            //一個存放int的set容器。

set<float> setFloat;     //一個存放float的set容器。

set<string> setString;     //一個存放string的set容器。

multiset<int> mulsetInt;            //一個存放int的multi set容器。

multi set<float> multisetFloat;     //一個存放float的multi set容器。

multi set<string> multisetString;     //一個存放string的multi set容器。

set的插入與迭代器

set.insert(elem);     //在容器中插入元素。

set.begin();  //返回容器中第一個數據的迭代器。

set.end();  //返回容器中最后一個數據之后的迭代器。

set.rbegin();  //返回容器中倒數第一個元素的迭代器。

set.rend();   //返回容器中倒數最后一個元素的后面的迭代器。

 

set<int> setInt;

setInt.insert(3); setInt.insert(1);setInt.insert(5);setInt.insert(2);

for(set<int>::iterator it=setInt.begin(); it!=setInt.end(); ++it)

{

      int iItem = *it;

      cout << iItem;    //或直接使用cout << *it

}

//這樣子便順序輸出  1 2 3 5。

 

set.rbegin()與set.rend()。略。

 

Set集合的元素排序

set<int,less<int> >  setIntA;  //該容器是按升序方式排列元素。

 set<int,greater<int>> setIntB;   //該容器是按降序方式排列元素。

set<int> 相當于 set<int,less<int>>。

ess<int>與greater<int>中的int可以改成其它類型,該類型主要要跟set容納的數據類型一致。

 疑問1:less<>與greater<>是什么?

疑問2:如果set<>不包含int類型,而是包含自定義類型,set容器如何排序?

要解決如上兩個問題,需要了解容器的函數對象,也叫偽函數,英文名叫functor。

下面將講解什么是functor,functor的用法。

 

使用stl提供的函數對象

set<int,greater<int>> setIntB;   

setIntB.insert(3);

setIntB.insert(1);

setIntB.insert(5);

setIntB.insert(2);

此時容器setIntB就包含了按順序的5,3,2,1元素

函數對象functor的用法

盡管函數指針被廣泛用于實現函數回調,但C++還提供了一個重要的實現回調函數的方法,那就是函數對象。

 functor,翻譯成函數對象,偽函數,算符,是重載了“()”操作符的普通類對象。從語法上講,它與普通函數行為類似。

greater<>與less<>就是函數對象。

下面舉出greater<int>的簡易實現原理。

 

下面舉出greater<int>的簡易實現原理。

struct greater

{

bool Operator() (const int& iLeft, const int& iRight)

{

       return (iLeft>iRight);    //如果是實現less<int>的話,這邊是寫return (iLeft<iRight);

}

}

容器就是調用函數對象的operator()方法去比較兩個值的大小。

 

題目:學生包含學號,姓名屬性,現要求任意插入幾個學生對象到set容器中,使得容器中的學生按學號的升序排序。

 

解:

//學生類

class CStudent

{

public:

CStudent(int iID, string strName)

{

m_iID = iID;

m_strName = strName;

}

     int m_iID; //學號

     string m_strName; //姓名

}

//為保持主題鮮明,本類不寫拷貝構造函數,不類也不需要寫拷貝構造函數。但大家仍要有考慮拷貝構造函數的習慣。

 

//函數對象

struct StuFunctor

{

bool operator()  (const CStudent &stu1, const CStudent &stu2)

{

return (stu1.m_iID<stu2.m_iID);

}

}

 

//main函數

void main()

{

set<CStudent, StuFunctor> setStu;

setStu.insert(CStudent(3,"小張"));

setStu.insert(CStudent(1,"小李"));

setStu.insert(CStudent(5,"小王"));

setStu.insert(CStudent(2,"小劉"));

//此時容器setStu包含了四個學生對象,分別是按姓名順序的“小李”,“小劉”,“小張”,“小王” 

}

 

set對象的拷貝構造與賦值

set(const set &st);      //拷貝構造函數

set& operator=(const set &st); //重載等號操作符

set.swap(st); //交換兩個集合容器

 

set<int> setIntA;

setIntA.insert(3);

setIntA.insert(1);

setIntA.insert(7);

setIntA.insert(5);

setIntA.insert(9);

 

set<int> setIntB(setIntA);  //1 3 5 7 9

set<int> setIntC;

setIntC = setIntA; //1 3 5 7 9

 

setIntC.insert(6);

setIntC.swap(setIntA);   //交換

set的大小

2 set.size(); //返回容器中元素的數目

2 set.empty();//判斷容器是否為空

 

set<int> setIntA;

setIntA.insert(3);

setIntA.insert(1);

setIntA.insert(7);

setIntA.insert(5);

setIntA.insert(9);

 

if (!setIntA.empty())

{

int iSize = setIntA.size(); //5

}

set的刪除

2 set.clear(); //清除所有元素

2 set.erase(pos); //刪除pos迭代器所指的元素,返回下一個元素的迭代器。

2 set.erase(beg,end);     //刪除區間[beg,end)的所有元素,返回下一個元素的迭代器。

2 set.erase(elem);     //刪除容器中值為elem的元素。

 

刪除區間內的元素

setInt是用set<int>聲明的容器,現已包含按順序的1,3,5,6,9,11元素。

set<int>::iterator itBegin=setInt.begin();

++ itBegin;

set<int>::iterator itEnd=setInt.begin();

++ itEnd;

++ itEnd;

++ itEnd;

setInt.erase(itBegin,itEnd);

//此時容器setInt包含按順序的1,6,9,11四個元素。

 

刪除容器中第一個元素

setInt.erase(setInt.begin()); //6,9,11

 

刪除容器中值為9的元素

set.erase(9);    

 

 

刪除setInt的所有元素

setInt.clear(); //容器為空

set的查找

2 set.find(elem);   //查找elem元素,返回指向elem元素的迭代器。

2 set.count(elem);   //返回容器中值為elem的元素個數。對set來說,要么是0,要么是1。對multiset來說,值可能大于1。

2 set.lower_bound(elem);  //返回第一個>=elem元素的迭代器。

2 set.upper_bound(elem);    //  返回第一個>elem元素的迭代器。

2 set.equal_range(elem); //返回容器中與elem相等的上下限的兩個迭代器。上限是閉區間,下限是開區間,如[beg,end)。

2  

2 以上函數返回兩個迭代器,而這兩個迭代器被封裝在pair中。

2 以下講解pair的含義與使用方法。

 

set<int> setInt;

setInt.insert(3);

setInt.insert(1);

setInt.insert(7);

setInt.insert(5);

setInt.insert(9);

 

set<int>::iterator itA = setInt.find(5);

int iA = *itA; //iA == 5

int iCount = setInt.count(5); //iCount == 1

 

set<int>::iterator itB = setInt.lower_bound(5);

set<int>::iterator itC = setInt.upper_bound(5);

int iB = *itB; //iB == 5

int iC = *itC; //iC == 7

 

pair< set<int>::iterator, set<int>::iterator > pairIt = setInt.equal_range(5);  //pair是什么?

pair的使用

pair譯為對組,可以將兩個值視為一個單元。

pair<T1,T2>存放的兩個值的類型,可以不一樣,如T1為int,T2為float。T1,T2也可以是自定義類型。

pair.first是pair里面的第一個值,是T1類型。

pair.second是pair里面的第二個值,是T2類型。

 

set<int> setInt;

...  //往setInt容器插入元素1,3,5,7,9

pair< set<int>::iterator , set<int>::iterator > pairIt = setInt.equal_range(5);

set<int>::iterator itBeg = pairIt.first;

set<int>::iterator itEnd = pairIt.second;

//此時 *itBeg==5  而  *itEnd == 7

小結

2 一、容器set/multiset的使用方法;

紅黑樹的變體,查找效率高,插入不能指定位置,插入時自動排序。

2 二、functor的使用方法;

    類似于函數的功能,可用來自定義一些規則,如元素比較規則。

2 三、pair的使用方法。

對組,一個整體的單元,存放兩個類型(T1,T2,T1可與T2一樣)的兩個元素。

 

案例:

int x;

    scanf("%ld",&x);

    multiset<int> h;//建立一個multiset類型,變量名是h,h序列里面存的是int類型,初始h為空

    while(x!=0){

        h.insert(x);//將x插入h中

        scanf("%ld",&x);

    }    

 

pair< multiset<int>::iterator , multiset<int>::iterator > pairIt = h.equal_range(22);

multiset<int>::iterator itBeg = pairIt.first;

multiset<int>::iterator itEnd = pairIt.second;

 

int nBeg = *itBeg;

int nEnd = *itEnd;

 

    while(!h.empty()){//序列非空h.empty()==true時表示h已經空了

multiset<int>::iterator c = h.begin();//c指向h序列中第一個元素的地址,第一個元素是最小的元素

        PRintf("%ld ",*c);//將地址c存的數據輸出

        h.erase(c);//從h序列中將c指向的元素刪除

    }


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产日韩欧美自拍| 欧美日韩激情网| 国产999在线| 欧美午夜影院在线视频| 久久国产精品偷| 国产91精品高潮白浆喷水| 国产午夜精品视频免费不卡69堂| 日韩在线观看免费全集电视剧网站| 国产精品久久久久久av福利| 日韩中文在线不卡| 亚洲最大激情中文字幕| 亚洲免费av片| 国产一区二区三区久久精品| 欧美极度另类性三渗透| 亚洲日本欧美中文幕| 91地址最新发布| 97在线视频国产| 深夜福利日韩在线看| 日韩美女视频中文字幕| 欧美日韩在线一区| 亚洲精品www久久久久久广东| 午夜精品福利电影| 91网站在线免费观看| 中文字幕视频一区二区在线有码| 茄子视频成人在线| 色综合久久精品亚洲国产| 97不卡在线视频| 国产69精品99久久久久久宅男| 成人情趣片在线观看免费| 亚洲精品白浆高清久久久久久| 国产视频999| 国产精品无av码在线观看| 国产成人精品电影| 97香蕉久久夜色精品国产| 97成人精品区在线播放| 精品视频在线播放色网色视频| 91国产视频在线播放| 在线亚洲午夜片av大片| 欧美午夜精品久久久久久人妖| 国产在线精品一区免费香蕉| 中日韩美女免费视频网站在线观看| 久久久久久亚洲| 日av在线播放中文不卡| 欧美精品久久久久久久| 亚洲精品国产福利| 成人国产亚洲精品a区天堂华泰| 亚洲国产中文字幕在线观看| 国产一区二区三区18| 日韩欧美在线视频日韩欧美在线视频| 欧美性在线视频| 国产成人拍精品视频午夜网站| 国产成人精彩在线视频九色| 琪琪亚洲精品午夜在线| 国产视频福利一区| 欧美日韩亚洲一区二区三区| 欧美午夜片欧美片在线观看| 精品国产1区2区| 久久精品久久精品亚洲人| 国产欧美日韩免费| 国产精品高清在线观看| 9.1国产丝袜在线观看| 自拍偷拍亚洲精品| 亚洲成av人影院在线观看| 午夜精品一区二区三区在线视| 91国产美女在线观看| 国产91热爆ts人妖在线| 国产一区二区三区在线视频| 97国产在线视频| 国产69精品久久久久99| 久久国产天堂福利天堂| 国产亚洲aⅴaaaaaa毛片| 成人免费观看a| 欧美资源在线观看| 久久人人爽国产| 国产精品嫩草影院久久久| 亚洲激情在线观看视频免费| 91免费综合在线| 亚洲精品美女网站| 色香阁99久久精品久久久| 欧美国产亚洲精品久久久8v| 欧美国产精品日韩| 国产一区二区三区丝袜| 欧美日韩成人在线视频| 国产精品黄色影片导航在线观看| 亚洲精品一区二区在线| 国产欧美日韩中文字幕| 7777kkkk成人观看| 国产日韩精品在线观看| 亚洲成在人线av| 亚洲乱码一区av黑人高潮| 另类专区欧美制服同性| 国产免费一区二区三区在线观看| 欧美噜噜久久久xxx| 一区二区三区四区在线观看视频| 欧美日韩综合视频网址| 久久中文精品视频| 久久免费视频在线| 97色在线视频| 精品性高朝久久久久久久| 国产成人精品免费视频| 久久夜精品香蕉| 亚洲伦理中文字幕| 国产精品伦子伦免费视频| 亚洲国产一区二区三区在线观看| 黑人巨大精品欧美一区二区三区| 在线观看日韩av| 狠狠操狠狠色综合网| 久久中国妇女中文字幕| 国产亚洲精品高潮| 97av视频在线| 亚洲精品视频中文字幕| 亚洲色图国产精品| 色婷婷av一区二区三区久久| 国产一区红桃视频| 欧美www视频在线观看| 久久99视频精品| 精品成人国产在线观看男人呻吟| 青青久久av北条麻妃黑人| 91在线网站视频| 欧美日韩中国免费专区在线看| 亚洲国产成人精品一区二区| 欧美电影在线观看网站| 欧美裸体男粗大视频在线观看| 亚洲美女黄色片| 亚洲福利在线观看| 蜜臀久久99精品久久久无需会员| 一区二区日韩精品| 亚洲精品福利在线| 黑人巨大精品欧美一区二区三区| 国产成人精品在线视频| 久久色免费在线视频| 国产精品美女www爽爽爽视频| 国产精品久久久久久影视| 国产精品免费小视频| 96精品久久久久中文字幕| 亚洲情综合五月天| 欧美黑人狂野猛交老妇| 欧美日本高清视频| 日韩中文av在线| 精品亚洲一区二区三区| 国产成人精品av在线| 久久频这里精品99香蕉| 日韩电影在线观看免费| 国产成人精品亚洲精品| 91精品久久久久久久久久久| 久久影视免费观看| 黑人巨大精品欧美一区二区三区| 日韩成人av一区| 亚洲香蕉成人av网站在线观看| 91最新国产视频| 日韩电影中文 亚洲精品乱码| 亚洲一区二区三区在线免费观看| 欧美丝袜一区二区三区| 亚洲欧美中文日韩在线v日本| 日韩最新av在线| 97福利一区二区| 国产精品国产自产拍高清av水多| 在线播放国产一区中文字幕剧情欧美| 久久精品国产精品亚洲| 日韩国产精品一区| 茄子视频成人在线| 日韩精品福利在线| 亚洲美女在线看| 国产精品久久网|