STL map常用操作

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;

参考: http://www.cnblogs.com/BeyondAnyTime/archive/2012/08/24/2654353.html





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值