四裸删、常用容器(Pair、Map阵赠、Multimap)

1. Pair對(duì)組

類模板:template <class T1, class T2> struct pair

參數(shù):T1是第一個(gè)值的數(shù)據(jù)類型涯塔,T2是第二個(gè)值的數(shù)據(jù)類型肌稻。

功能:pair將一對(duì)值組合成一個(gè)值,這一對(duì)值可以具有不同的數(shù)據(jù)類型(T1和T2)匕荸,兩個(gè)值可以分別用pair的兩個(gè)公有函數(shù)first和second訪問爹谭。

//第一種方式 創(chuàng)建一個(gè)Pair
    pair<int,string> mypair(10,"aaa");
    cout<<mypair.first<<"  "<<mypair.second<<endl;

    //第二種 創(chuàng)建Pair
    pair<string,string> mypair2 = make_pair("aaa","bbb");
    //等價(jià)于   auto mypair2 = make_pair("aaa","bbb");
    cout<<mypair2.first<<"  "<<mypair2.second<<endl;

    //第三種 拷貝構(gòu)造 
    pair<int,string> mypair3 = mypair;
     cout<<mypair3.first<<"  "<<mypair3.second<<endl;

2. map/multimap容器

2.1 map/multimap特性

map相對(duì)于set區(qū)別,map具有鍵值和實(shí)值榛搔,所有元素根據(jù)鍵值自動(dòng)排序诺凡。pair的第一個(gè)元素被稱為鍵值,第二個(gè)元素被稱為實(shí)值践惑。map也是以紅黑樹為底層實(shí)現(xiàn)機(jī)制

1.png
2.png

問題:我們通過map的迭代器可以修改map的鍵值嗎腹泌?

答案是否定的,鍵值關(guān)系到容器內(nèi)元素的排列規(guī)則尔觉,任意改變鍵值會(huì)破壞容器的排列規(guī)則凉袱,但是你可以改變實(shí)值

map和multimap的區(qū)別在于,map不允許相同的key存在侦铜,multimap允許相同key值存在

2.2 map常用API

map構(gòu)造函數(shù)

map<T1,T2> mapTT;//默認(rèn)構(gòu)造
map(const map &mp);//拷貝構(gòu)造

//map容器的模板參數(shù) 需要指定key類型 value 類型
map<int,string> mymap;//默認(rèn)構(gòu)造
map<int,string> mymap2(mymap);//拷貝構(gòu)造

map賦值操作

map &operator=(const map &mp);//
swap(mp);//交換兩個(gè)集合容器

map大小操作

int size();//返回容器中元素的數(shù)目
bool empty();//判斷容器是否為空

map插入數(shù)據(jù)元素操作

pair<itertator,bool> insert(const pair<KEY_TYPE,VALUE_KEY) &val);//只有在val不存在時(shí)插入val.返回值是一個(gè)指向被插入元素的迭代器和一個(gè)描述是否插入的bool值
void insert(iterator beg,iterator end);//插入beg到end的元素到map中
iterator insert(iterator pos,const pair<KEY_TYPE,VALUE_KEY) &val);//插入val到pos后面专甩,然后返回一個(gè)指向這個(gè)元素的迭代器

------------------------------------
pair<itertator,bool> insert(const pair<KEY_TYPE,VALUE_KEY) &val);

map<int,string> mapStu;
//第一種,通過Pair的方式插入對(duì)象
mapStu.insert(pair<int,string>(3,"小張"));

//第二種钉稍,通過pair的方式插入對(duì)象
mapStu.insert(make_pair(-1,"校長"));

//第三種 通過value_type的方式插入對(duì)象那個(gè)
mapStu.insert(map<int,string>::value_type(1,"小李"));

pair<map<int,string>::iterator,bool> ret = mapStu.insert(map<int,string>::value_type(1,"小紅"));//插入成功or失敗返回pair類型
if(ret.second){
   cout<<"插入成功"<<endl;
}
else{
   cout<<"插入失敗"<<endl;
}

//第四種 通過數(shù)組的方式插入值
mapStu[3] = "小劉";
mapStu[5] = "小王";

mapStu[3] = "小錢";//這樣重復(fù)的話涤躲,如果key值已經(jīng)存在,就會(huì)修改容器指定key值元素的值

//如果你訪問的key不存在贡未,它會(huì)幫你把這個(gè)數(shù)據(jù)給你插進(jìn)去
cout<<"key=20不存在篓叶,value:"<<mapStu[20]<<endl;//value為0

for(map<int,string>::itertaor it = mapStu.begin();it != mapStu.end();it++)
{
   cout<<"key:"<<it->first<<" "<<"value:"<<it->second<<endl;
}//你會(huì)發(fā)現(xiàn)竟然多了一個(gè)key為20的元素!P叱印缸托!,所以mapStu[20]不只是讀取瘾蛋,還是插入
cout<<endl;


map刪除和查找

//刪除
void erase(iterator pos);//erase()函數(shù)刪除在pos位置的元素
void erase(iterator start,iterator end);//刪除在start和end之間的元素
size_type erase(const KEY_TYPE &key);//刪除那些值為key的所有元素

void print(map<int, int>& mymap){
    for (map<int, int>::iterator it = mymap.begin(); it != mymap.end();it++){
        cout << it->first << " " << it->second << " ";
    }
    cout << endl;
}

void test(){

    map<int, int> mymap;
    mymap.insert(make_pair(1, 2));
    mymap.insert(make_pair(2, 3));
    mymap.insert(make_pair(3, 4));

    mymap.erase(2);  //根據(jù)Key刪除元素
    print(mymap);
    mymap.erase(mymap.begin()); //刪除第一個(gè)元素
    print(mymap);
    mymap.erase(mymap.begin(),mymap.end()); // mymap.clear
    cout << "map size:" << mymap.size() << endl;

//---------------------------------
//查找
iterator find(const KEY_TYPE &key);
iterator upper_bound(const KEY_TYPE &key);//upper_bound()函數(shù)返回一個(gè)迭代器俐镐,指向map中鍵值>key的第一個(gè)元素
iterator lower_bound(const KEY_TYPE &key)//lower_bound()函數(shù)返回一個(gè)迭代器,指向map中鍵值>=key的第一個(gè)元素
pair<map::iterator,map::itertaor> equal_range(const KEY_TYPE &key);//equal_range()函數(shù)返回兩個(gè)迭代器哺哼,一個(gè)指向第一個(gè)鍵值為key的元素佩抹,另一個(gè)指向最后一個(gè)鍵值為key的元素
int count(KEY_TYPE keyElem);//返回容器中key為keyElem的對(duì)組個(gè)數(shù)。對(duì)map來說取董,要么是0棍苹,要么是1.對(duì)multimap來說,值可能大于1


    map<int, int>::iterator pos =  mymap.find(3);
    if (pos == mymap.end()){
        cout << "沒有找到!" << endl;
    }
    else{
        cout << "查找到:" << pos->first << " value:" << pos->second << endl;
    }

    cout << "---------------" << endl;
    pos =  mymap.lower_bound(2);
    if (pos == mymap.end()){
        cout << "沒有找到!" << endl;
    }
    else{
        cout << "查找到:" << pos->first << " value:" << pos->second << endl;
    }

    pos = mymap.upper_bound(2);
    if (pos == mymap.end()){
        cout << "沒有找到!" << endl;
    }
    else{
        cout << "查找到:" << pos->first << " value:" << pos->second << endl;
    }

    pair<map<int, int>::iterator, map<int, int>::iterator> pos2 = mymap.equal_range(2);
    if (pos2.first == mymap.end()){  //第一個(gè)迭代器
        cout << "沒有找到!" << endl;
    }
    else{
        cout << "查找到:" << pos2.first->first << " value:" << pos2.first->second << endl;
    }

    if (pos2.second == mymap.end()){ //第二個(gè)迭代器
        cout << "沒有找到!" << endl;
    }
    else{
        cout << "查找到:" << pos2.second->first << " value:" << pos2.second->second << endl;
    }



}

lower_bound和upper_bound的區(qū)別

multimap練習(xí)

//multimap案例
//公司今天招聘了5個(gè)員工茵汰,5個(gè)員工進(jìn)入公司之后枢里,需要指派員工在哪個(gè)部門工作
//人員信息有:姓名 年齡 電話 工資等組成
//通過multimap進(jìn)行信息的插入 保存 顯示
//分部門顯示員工信息 顯示全部員工信息
#include <iostream>
#include <string>
#include <map>
#include <vector>
using namespace std;

#define SALE_DEPARTEMENT   1//銷售部
#define DEVELOP_DEPARTMENT 2//開發(fā)部
#define FINACIAL_DEPARTMENT 3//財(cái)務(wù)部

class Employee
{
public:
    string name;
    int age;
    string tele;
    double salary;
};

//創(chuàng)建員工 5名
void Create_Employee(vector<Employee> &v){

    string nameseed = "ABCDE";
    for (int i = 0; i < 5; ++i)
    {
        Employee ep;
        ep.name = "員工";
        ep.name += nameseed[i];

        ep.age = rand() % 30;
        ep.salary = rand() % 10000 + 10000;
        ep.tele = "+86-8888888";
        v.push_back(ep);
    }

}

//對(duì)員工指派部門
void Set_Ep_Group(vector<Employee> &v,multimap<int,Employee> & group){
    for(vector<Employee>::iterator it = v.begin();it != v.end();it++){

        cout<<"當(dāng)前員工信息"<<endl;
        cout<<"名字:"<<it->name<<" 年齡:"<<it->age<<" 工資:"<<it->salary<<" 電話:"<<it->tele<<endl;
        
        int departmentID = -1;
        while(true){
            cout<<"請(qǐng)輸入部門(1 銷售部 2 開發(fā)部 3 財(cái)務(wù)部):"<<endl;
            scanf("%d",&departmentID);

            if (departmentID == SALE_DEPARTEMENT)
            {
                group.insert(make_pair(SALE_DEPARTEMENT,*it));
                break;
            }
            else if(departmentID == DEVELOP_DEPARTMENT)
            {
                group.insert(make_pair(DEVELOP_DEPARTMENT,*it));
                break;
            }
            else if(departmentID == FINACIAL_DEPARTMENT)
            {
                group.insert(make_pair(FINACIAL_DEPARTMENT,*it));
                break;
            }
            else
            {
                cout<<"輸入錯(cuò)誤,請(qǐng)重新輸入"<<endl;
            }
        }

    }
}

//打印各部門員工信息
void Show_EP_Info(multimap<int,Employee> &group){
    int departmentID = -1;
    while(true){
        cout<<"請(qǐng)輸入要查看部門(1 銷售部 2 開發(fā)部 3 財(cái)務(wù)部):"<<endl;
        scanf("%d",&departmentID);

       //驗(yàn)證輸入的有效性
        if (departmentID < 1 || departmentID > 3)
        {
            continue;
        }
        multimap<int,Employee>::itertaor ret = group.find(departmentID);
        int count = group.count(departmentID);
        while(count--){
            cout<<"姓名:"<<pos->second.name <<" 年齡:"<<pos->second.age<<" 工資:"<<pos->second.salary<< "電話:"<<pos->second.tele<<endl;
            pos++;
        }
    }
}


int main(int argc, char const *argv[])
{
    
    vector<Employee> v;//放員工信息
    Create_Employee(v);//創(chuàng)建員工

    //員工分組
    multimap<int,Employee> Epgroup;//存放分組后的員工信息
    Set_Ep_Group(v,Epgroup);//員工分組
    Show_EP_Info(Epgroup);

    return 0;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市栏豺,隨后出現(xiàn)的幾起案子彬碱,更是在濱河造成了極大的恐慌,老刑警劉巖奥洼,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件巷疼,死亡現(xiàn)場離奇詭異,居然都是意外死亡灵奖,警方通過查閱死者的電腦和手機(jī)嚼沿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓷患,“玉大人伏尼,你說我怎么就攤上這事∥疚玻” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵燥透,是天一觀的道長沙咏。 經(jīng)常有香客問我,道長班套,這世上最難降的妖魔是什么肢藐? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮吱韭,結(jié)果婚禮上吆豹,老公的妹妹穿的比我還像新娘。我一直安慰自己理盆,他們只是感情好痘煤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著猿规,像睡著了一般衷快。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上姨俩,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天蘸拔,我揣著相機(jī)與錄音,去河邊找鬼环葵。 笑死调窍,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的张遭。 我是一名探鬼主播邓萨,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了先誉?” 一聲冷哼從身側(cè)響起湿刽,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎褐耳,沒想到半個(gè)月后诈闺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡铃芦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年雅镊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刃滓。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡仁烹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出咧虎,到底是詐尸還是另有隱情卓缰,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布砰诵,位于F島的核電站征唬,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏茁彭。R本人自食惡果不足惜总寒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望理肺。 院中可真熱鬧摄闸,春花似錦、人聲如沸妹萨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乎完。三九已至画切,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間囱怕,已是汗流浹背霍弹。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留娃弓,地道東北人典格。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像台丛,于是被迫代替她去往敵國和親耍缴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子砾肺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容