STL整理之map

轉載請註明出處,部份內容引自李煜東《算法競賽進階指南》
 算法



前置知識:    C++、C語言入門

函數



Map是什麼spa


Map是從鍵(key)到值(value)的映射,其內部實現是一棵以key爲關鍵碼的紅黑樹code


Map的相關操做blog


頭文件排序

 

#include<map>


聲明:ci


像這樣:string

map<key的類型,value的類型>名稱; 好比: map<long long,bool>mp; map<string,int>mp; map<pair<int,int>,vector<int>>mp;

就像其餘須要排序的數據類型同樣,key爲一個結構體的map,須要重載小於號it

struct pos{ int x,y,s; string move[100]; }; map<pos,int>mp; bool operator <(const pos &ai,const pos &bi) { return (ai.x==bi.x)?ai.y>bi.y:ai.x>bi.x; }


[]運算符入門


map重載了[]運算符,map[key]返回key到value的引用,時間複雜度O(log n)
[]操做符是map最吸引人的地方。咱們能夠很方便地經過map[key]來獲得key對應的value,還能夠對map[key]進行賦值操做,改變key對應的value。
若查找的key不存在,則執行map[key]後,map會自動新建一個二元組(key,zero),並返回zero的引用。

eg. map<string,int>mp; for(int i=1;i<=n;i++) { string s; int num; cin>>s>>num; mp[s]=num; } for(int i=1;i<=m;i++) { string s; cin>>s; cout<<mp[s]<<endl; }


map.size()


統計map中元素個數,函數返回一個整形變量,表示map中元素個數,時間複雜度O(1)

用法:名稱.size(); eg. int num=mp.size();


map.empty()


檢查map是否爲空,返回一個bool型變量,1表示map爲空,不然爲非空,時間複雜度O(1)

用法:名稱.empty(); eg. if(mp.empty()) cout<<"Mymap is Empty."<<endl;


map.clear()


清空map,無返回值

用法:名稱.clear();
eg.
mp.clear();


map.count(x)


返回map中key爲x的元素個數,時間複雜度爲O(log n)

用法:名稱.count(x) eg. if(!mp.count(x)) mp[x]=1;


迭代器


雙向訪問迭代器,不支持隨機訪問,支持星號解除引用,僅支持「++」,「--」這兩個算術操做


引用和操做:

map<類型,類型>::iterator it; eg. map<int,int>::iterator it=mp.begin(); it++; it--;

若把it++,則it將會指向「下一個」元素。這裏的下一個是指在key從小到大排序的結果中,排在it下一名的元素。同理,若把it--,則it會指向排在上一個的元素
「++」,「--」操做的複雜度均爲O(log n)
對map的迭代器解除引用後,將獲得一個二元組pair<...,...>

遍歷map及訪問其中的元素

for(map<int,int>::iterator it=mp.begin();it!=mp.end();it++) if(it->second==ans)        //訪問二元組中第二個,即value
        cout<<it->first<<endl;        //訪問key


map.find(x)


在map中查找key爲x的二元組,並返回指向該二元組的迭代器,若不存在,返回map.end(),時間複雜度爲O(log n)

用法:名稱.find(x); eg. if(mp.find(s)!=mp.end()) cout<<"Have Found!"<<endl;


map.insert(pair<...,...>)


在map中插入,參數是pair<key.type,value.type>,返回插入地址的迭代器和是否插入成功的bool併成的pair,時間複雜度爲O(log n)
PS:insert在進行插入的時候是不容許有重複的鍵值的,若是新插入的鍵值與原有的鍵值重複則插入無效

用法:名稱.insert(pair<key的類型,value的類型>); eg. mp.insert(make_pair(2,3));


map.erase(參數)


刪除,參數能夠是pair或者迭代器,返回下一個元素的迭代器,時間複雜度爲O(log n)

用法:名稱.erase(參數); eg. map<int,int>::iterator it=mp.begin(); mp.erase(it); mp.erase(make_pair(2,3));
相關文章
相關標籤/搜索