map是STL的一个容器,和set一样,map也是一种关联式容器。它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,有助于我们处理一对一数据。map内部构造是一棵红黑树。
map基本操作:
插入操作:
第一种:数据的插入大概有三种方式,第一种:insert(pair<T1,T2,>(key1,value1))。
第二种:insert(map<T1,T2>::value_type(key1,value1)),这种插入方式和第一种基本相似。
第三种:利用数组进行插入
s.insert(pair<int,string>(3,"zhang")); //pair插入
s.insert(map<int,string>::value_type(2,"li")); //value_type插入
s[1]="wang"; //数组插入
s[5]="sun";
删除操作:
关于数据的删除,大概有三种方式进行删除:
第一种:
erase(map<T1,T2>::iterator iter),删除迭代器所指的节点。
第二种:
erase(key k),根据键值进行删除,删除键值k所指的节点 。
第三种:
erase(map<T1,T2>::iteratormap iter1,<T1,T2>::iteratoriter2),删除iter1和iter2之间的数据。
map<int,string>::iterator p; //删除元素
p=s.find(1); //迭代器删除
s.erase(p);
cout<<"size="<<s.size()<<endl;
for(i=s.begin();i!=s.end();i++)
cout<<i->first<<" "<<i->second<<endl;
int flag2=s.erase(2); //关键字删除
if(flag)cout<<"delete finish"<<endl;
else cout<<"not delete"<<endl;
for(i=s.begin();i!=s.end();i++) //迭代器成片删除
cout<<i->first<<" "<<i->second<<endl;
s.erase(s.begin(),s.end());
遍历操作:
map<int ,string>::iterator i; //正向遍历 for(i=s.begin();i!=s.end();i++) cout<<i->first<<" "<<i->second<<endl; cout<<endl; map<int,string>::reverse_iterator j; //反向遍历 for(j=s.rbegin();j!=s.rend();j++) cout<<j->first<<" "<<j->second<<endl; cout<<endl; int size=s.size(); for(int k=1;k<=size;k++) //数组遍历 cout<<k<<" "<<s[k]<<endl; cout<<endl;
查找操作:
map中用来查找的函数是find,但是能完成查找功能的函数却并不止这一个,比如count也是可以完成查找的,因为map中的键值是不允许重复的,所以一个键值只能出现一次,这说明count的返回值就只能是0或1了,那么显然这就能完成查找了,但是用count来完成查找并不是最优的选择,因为原来的本意是用count来完成计数的,这在vector等序列式容器中是非常好用的,而map中之所以有这个count函数,就是为了STL提供统一的接口,这样说来map中的upper_bound和lower_bound,equel_range等函数组合起来也是可以完成查找功能的。
count和find还是有区别的,那就是count只能单纯的查找元素是否存在,而find能定位要查找元素的位置。
第一种count查找和第二种find查找:
int flag=s.count(1); //count查找
if(flag==1)cout<<"YES\n"<<endl;
else cout<<"NO\n"<<endl;
map<int ,string>::iterator m; //find 查找
m=s.find(2);
if(m!=s.end())
cout<<"Find,the value is:"<<m->second<<endl;
else
cout<<"Not find"<<endl;
第三种equal_range 查找
Lower_bound函数用法,这个函数用来返回要查找关键字的下界(是一个迭代器)
Upper_bound函数用法,这个函数用来返回要查找关键字的上界(是一个迭代器)
例如:map中已经插入了1,2,3,4的话,如果lower_bound(2)的话,返回的2,而upper-bound(2)的话,返回的
就是3
Equal_range函数返回一个pair,pair里面第一个变量是Lower_bound返回的迭代器,pair里面第二个迭代器是
Upper_bound返回的迭代器,如果这两个迭代器相等的话,则说明map中不出现这个关键字。
map<int,string>::iterator n; //equal_range 查找
n=s.lower_bound(2);//下界
cout<<n->second<<endl;
n=s.upper_bound(2);//上界
cout<<n->second<<endl;
pair<map<int ,string>::iterator,map<int ,string>::iterator> mappair;
mappair=s.equal_range(2);
if(mappair.first==mappair.second)
cout<<"Not find"<<endl;
else
cout<<"Find"<<endl;
cout<<endl;
清空操作:
s.clear();
判空操作:
int x=s.empty(); //清空和判空
if(x)
cout<<"empty"<<endl;
else
cout<<"not empty"<<endl;