STL中map,set的使用

Map:
1.定义:
Map是标准关联式容器之一,一个map是一个键值对序列,即(key ,value)对。它提供基于key的快速检索能力,在一个map中key值是唯一的。

2.Map常用的方法主要有:insert,erase,size,count,begin,end,find,clear,empty。

insert方法:在map中插入一个元素,map中记录的元素通常为键值对,所以,在存储时会把,键和值封装成pair然后进行插入,例如:mymap.insert(pair < string,string>(str,num));其中str和num为string类型的变量。当然也可以简单的写成mymap[str]=num;此处mymap即为map<string,string>类型的变量。因为map在实现过程中对[]进行了重载。
第一种方式若插入的元素的键值已经存在于map中,那么就会插入失败,不会修改元素的键值对信息,若键值在map中查找不到,那么就会将该新元素加入到map中去。
第二种方式比较直观,但存在一个性能的问题。插入时,先在mymap中查找主键为str的项,没发现,然后将一个新的对象插入mymap,键是str,值是一个空字符串,插入完成后,将字符串赋为num, 该方法会将每个值都赋为缺省值,然后再赋为显示的值,如果元素是类对象,则开销比较大。若找到键值为str的项,则用num更改原来的num值。

erase方法:
erase主要是删除map中的某个项,需要参数key,例如mymap.erase(str);此句的意思就是删除key值为str的键值对。

size方法:
统计map中键值对的个数,mymap.size()返回值即为mymap中键值对的个数,若map为空则返回0。

count方法:
统计map中某个键值出现的次数,因为map中键值唯一,所以此方法可以用来检测某键值是否存在,例如在删除时可以mymap.count(str),若为0则可以提示用户此键值不存在,若为1则直接删除。

begin、end方法:
begin方法返回map迭代器类型,通过此迭代器与end方法的返回值进行比较就可以很容易的对map进行遍历。

find方法:
查找某个键在map中的位置。

clear方法:
清空map中的所有元素

empty方法:
判断map是否为空,若为空则返回真若非空则返回假。

用例代码如下:

#include<iostream>
#include<map>
#include<string>
using namespace std;

int main()
{
    map<string,int> mymap;
    map<string,int>::iterator it;
    //插入
    mymap.insert ( pair<string,int>("string",1) );
    mymap.insert ( pair<string,int>("sort",2) );
    mymap.insert ( pair<string,int>("erase",3) );
    mymap.insert ( pair<string,int>("begin",4) );
    mymap["find"] = 5;

    mymap.erase("find");//删除

    it = mymap.find("begin");
    mymap.erase(it);
    cout<<"map中键队的个数:"<<mymap.size()<<endl;
    cout<<"map是否为空?"<<mymap.empty()<<endl;

    for ( it=mymap.begin() ; it != mymap.end(); it++ )
    {
        cout << (*it).first << " => " << (*it).second << endl;
    }

    mymap.clear();//全删除
    cout<<"map是否为空?"<<mymap.empty()<<endl;

    for ( it=mymap.begin() ; it != mymap.end(); it++ )
    {
        cout << (*it).first << " => " << (*it).second << endl;
    }
    return 0;
}

结果:
这里写图片描述

set的用法:
1.定义:
set(集合)是一个容器,它其中所包含的元素的值是唯一的。set支持唯一键值,set中的值都是特定的,而且只出现一次。
2.set常用的主要方法有:insert,erase,find,count,size,begin,end等。

1、插入:insert()
1)pair<iterator,bool> insert ( const value_type& x )
在迭代器中插入一个数据,如果这个数据不存在就直接插入,其返回值为插入后元素的迭代器和true。如果这个元素已经存在,那么返回当前元素以及false.
2)iterator insert ( iterator position, const value_type& x )
在指定的位置插入指定的数据,position是一个迭代器的位置,x表示的是要插入的数。如果插入成功的话,会返回一个插入新位置的迭代器。
3)template<class InputIterator> void insert(InputIterator first,InputIterator last)
插入一段迭代器区间
**2、删除(erase)
1)void erase(iterator position)**
删除一个迭代器位置
2)size_type erase(sonst key_type& x)
删除成功的话就返回1
3)void erase(iterator first, iterator last)
删除一段迭代器区间
3、查找:find()
iterator find(const key_type& x) const;
若找到返回该迭代器的位置,否则就返回的是最后一个元素后面的位置
4、数量:count()
**size_type count(const key_type& x)con**st
count是为了统计某个数值出现的次数,在set里面不能重复出现相同的数值,count的返回值只有0和1两个值,0表示的是不存在,1表示存在。

用例代码如下:


#include<iostream>  
using namespace std;  
#include<set>  
void fun(set<int> myset)    
{    
    set<int>::iterator it;    
    for (it=myset.begin(); it!=myset.end(); it++)    
    {    
        cout <<*it<<" ";    
    }    
    cout << endl;    

}    
void TestSet()    
{    
    set<int> t;    
    set<int>::iterator it;    
    pair<set<int>::iterator,bool> ret; 

    //第一种插入方法
    cout<<"插入1,2,3,4,5:"<<endl;
    t.insert(1);    
    t.insert(2);    
    t.insert(3);    
    t.insert(4);    
    t.insert(5);    
    fun(t);    
    cout<<endl;    

    cout<<"再次插入2:"<<endl;
    ret = t.insert(2);  
    if(ret.second == false)  
    {    
        it=ret.first;      
    }    
    cout<<*it<<endl;    

    //第二种插入 ,在某一位置插入 
    cout<<"在某一位置插入7,8,9:"<<endl;
    t.insert (it,7);                     
    t.insert (it,8);                     
    t.insert (it,9);                     
    fun(t);    
    cout<<endl;    

    //第三种插入  ,将某个区间插入  
    cout<<"将一个数组插入:"<<endl;
    int a[]= {10,11,12};                 
    t.insert (a,a+3);    
    fun(t);    
    cout<<endl;

    cout<<"10是否存在:"<<endl;
    cout<<"10 count:"<<t.count(10)<<endl;    
    cout<<"size:"<<t.size()<<endl;    

    cout<<"删除1:"<<endl;
    t.erase (1);  
    fun(t);    
    cout<<endl;    

    cout<<"删除3:"<<endl;
    it=t.begin();    
    it++;                                                
    t.erase (it);
    fun(t);    
    cout<<endl;  

    cout<<"删除11及以后的数:"<<endl;
    it=t.find (11);    
    t.erase ( it, t.end() );  
    fun(t);    
    cout<<endl;    
}  

int main()  
{  
    TestSet();  
    return 0;  
}  

结果如下:
这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值