map/multimap的简介

²map是标准的关联式容器,一个map是一个键值对序列,即(key,value)对。它提供基于key的快速检索能力。
²map中key值是唯一的。集合中的元素按一定的顺序排列。元素插入过程是按排序规则插入,所以不能指定插入位置。
²map的具体实现采用红黑树变体的平衡二叉树的数据结构。在插入操作和删除操作上比vector快
²map.insert(...);    //往容器插入元素,返回pair<iterator,bool>
²
²在map中插入元素的三种方式:
假设  map<int, string> mapStu;
²一、通过pair的方式插入对象
mapStu.insert(  pair<int,string>(3,"小张")  );
²二、通过value_type的方式插入对象
mapStu.insert(  map<int,string>::value_type(1,"小李")  );
²三、通过数组的方式插入值
mapStu[3] = “小刘";
mapStu[5] = “小王";
...
²第三种方法非常直观,但存在一个性能的问题。插入3时,先在mapStu中查找主键为3的项,若没发现,则将一个键为3,值为初始化值的对组插入到mapStu中,然后再将值修改成“小刘”。若发现已存在3这个键,则修改这个键对应的value
string strName = mapStu[2];   //取操作或插入操作
只有当mapStu存在2这个键时才是正确的取操作,否则会自动插入一个实例,键为2,值为初始化值
²前两种方法,采用的是insert()方法,该方法返回值为pair<iterator,bool>
²
pair< map<int,string>::iterator ,  bool > pairResult  = mapStu.insert(  pair<int,string>(3,"小张")  );
如果插入成功,(pairResult.first)->first==3, (pairResult.first)->second=="小张"  pairResult.second==true
²map<T1,T2,less<T1> >  mapA;  //该容器是按键的升序方式排列元素。未指定函数对象,默认采用less<T1>函数对象。
²map<T1,T2,greater<T1>> mapB;   //该容器是按键的降序方式排列元素。
²less<T1>与greater<T1>  可以替换成其它的函数对象functor。
²map.begin();  //返回容器中第一个数据的迭代器。
²map.end();  //返回容器中最后一个数据之后的迭代器。
²map.rbegin();  //返回容器中倒数第一个元素的迭代器。
²map.rend();   //返回容器中倒数最后一个元素的后面的迭代器。
²
²可编写自定义函数对象以进行自定义类型的比较,使用方法与set构造时所用的函数对象一样

map(const map &mp);      //拷贝构造函数
map& operator=(const map &mp); //重载等号操作符
map.swap(mp); //交换两个集合容器
如:
map<T1,T2> mapIntA, mapIntC;
...
map<T1,T2> mapIntB(mapIntA);
map<T1,T2> mapIntD;
mapIntD = mapIntC;
²map.size(); //返回容器中元素的数目
²map.empty();//判断容器是否为空
²map.clear(); //删除所有元素
²map.erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
²map.erase(beg,end);     //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
²map.erase(keyElem);     //删除容器中key为keyElem的对组
²map.find(key);   查找键key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回map.end();
²map.count(keyElem);   //返回容器中key为keyElem的对组个数。对map来说,要么是0,要么是1。对multimap来说,值可能大于1
map<int,string>::iterator it=mapStu.find(3);
if(it == mapStu.end())
{
//没找到
}
else
{
    //找到了
        pair<int, string> pairStu = *it;
  int iID = pairStu.first; //或   int  iID = it->first;
        string strName = pairStu.second; //或   string strName = it->second;
}
²map.lower_bound(keyElem);  //返回第一个key>=keyElem元素的迭代器。
²map.upper_bound(keyElem);    //  返回第一个key>keyElem元素的迭代器。
例如:  mapStu是用map<int,string>声明的容器,已包含{1,"小李"}{3,"小张"}{5,"小王"}{7,"小赵"}{9,"小陈"}元素。map<int,string>::iterator it;
it = mapStu.lower_bound(5);  //it->first==5    it->second=="小王"
it = mapStu.upper_bound(5);   //it->first==7   it->second=="小赵"
it = mapStu.lower_bound(6);  //it->first==7    it->second=="小赵"
it = mapStu.upper_bound(6);    //it->first==7   it->second=="小赵


例如 map<int,string> mapStu;
...  //往mapStu容器插入元素{1,"小李"}{3,"小张"}{5,"小王"}{7,"小赵"}{9,"小陈"}
pair< map<int,string>::iterator , map<int,string>::iterator > pairIt = mapStu.equal_range(5);
map<int, string>::iterator itBeg = pairIt.first;
map<int, string>::iterator itEnd = pairIt.second;
//此时 itBeg->first==5  ,  itEnd->first == 7,
itBeg->second=="小王", itEnd->second=="小赵"
²struct userdevice{
²string m_devicename;
²long m_deviceid;
²int     m_devicePopedom;
²};
² 
²typedef multimap<string,userdevice> USERTABLE;
²typedef USERTABLE::const_iterator CIT;
²typedef pair<CIT, CIT> Range;
²

讲解要点

容器map/multimap的使用方法

map/multimap的简介

map/multimap对象的默认构造

map/multimap采用模板类实现,对象的默认构造形式:

map<T1,T2> mapTT;

multimap<T1,T2>  multimapTT; 

如:

map<int, char> mapA;

map<string,float> mapB;

//其中T1,T2还可以用各种指针类型或自定义类型

map的插入与迭代器

map<int, string> mapA;

 

              pair<map<int,string>::iterator, bool > pairResult =mapA.insert(pair<int,string>(3,"小张"));               //插入方式一

 

              intiFirstFirst = (pairResult.first)->first;              //iFirst== 3;

              stringstrFirstSecond = (pairResult.first)->second;              //strFirstSecond为"小张"

              boolbSecond = pairResult.second;                                                 //bSecond== true;

             

              mapA.insert(map<int,string>::value_type(1,"小李"));               //插入方式二

 

              mapA[3]= "小刘";                     //修改value

              mapA[5]= "小王";                     //插入方式三

 

              stringstr1 = mapA[2];                 //执行插入 string() 操作,返回的str1的字符串内容为空。

              stringstr2 = mapA[3];                 //取得value,str2为"小刘"

 

 

//迭代器遍历

              for(map<int,string>::iterator it=mapA.begin(); it!=mapA.end(); ++it)

              {

                     pair<int,string> pr = *it;

                     intiKey = pr.first;

                     stringstrValue = pr.second;

              }

map.rbegin()与map.rend()  略。

map对象的拷贝构造与赋值

              map<int,string> mapA;

              mapA.insert(pair<int,string>(3,"小张"));    

              mapA.insert(pair<int,string>(1,"小杨"));    

              mapA.insert(pair<int,string>(7,"小赵"));    

              mapA.insert(pair<int,string>(5,"小王"));    

 

              map<int,string> mapB(mapA);                  //拷贝构造

             

              map<int,string> mapC;

              mapC= mapA;                                                       //赋值

 

              mapC[3]= "老张";

              mapC.swap(mapA);                     //交换

map的大小

              map<int,string> mapA;

              mapA.insert(pair<int,string>(3,"小张"));    

              mapA.insert(pair<int,string>(1,"小杨"));    

              mapA.insert(pair<int,string>(7,"小赵"));    

              mapA.insert(pair<int,string>(5,"小王"));    

 

              if(mapA.empty())

              {

                     intiSize = mapA.size();        //iSize == 4

              }

map的删除

map<int, string> mapA;

              mapA.insert(pair<int,string>(3,"小张"));    

              mapA.insert(pair<int,string>(1,"小杨"));    

              mapA.insert(pair<int,string>(7,"小赵"));    

              mapA.insert(pair<int,string>(5,"小王"));    

 

              //删除区间内的元素

              map<int,string>::iteratoritBegin=mapA.begin();

              ++itBegin;

              ++itBegin;

              map<int,string>::iteratoritEnd=mapA.end();

              mapA.erase(itBegin,itEnd);                 //此时容器mapA包含按顺序的{1,"小杨"}{3,"小张"}两个元素。

 

 

 

              mapA.insert(pair<int,string>(7,"小赵"));    

              mapA.insert(pair<int,string>(5,"小王"));    

 

              //删除容器中第一个元素

              mapA.erase(mapA.begin());         //此时容器mapA包含了按顺序的{3,"小张"}{5,"小王"}{7,"小赵"}三个元素

 

              //删除容器中key5的元素

              mapA.erase(5);   

 

 

              //删除mapA的所有元素

              mapA.clear();               //容器为空

map的查找

map<int, string> mapA;

              mapA.insert(pair<int,string>(3,"小张"));    

              mapA.insert(pair<int,string>(1,"小杨"));    

              mapA.insert(pair<int,string>(7,"小赵"));    

              mapA.insert(pair<int,string>(5,"小王"));    

 

              //find方法

              map<int,string>::iterator it1 = mapA.find(5);            //it1指向{5,"小王"}元素

 

              intiCount = mapA.count(5);               //iCount== 1

 

              //lower_bound方法

              map<int,string>::iterator it2 = mapA.lower_bound(5);             //it2指向{5,"小王"}元素

 

              //upper_bound方法

              map<int,string>::iterator it3 = mapA.upper_bound(5);             //it3指向{7,"小赵"}元素

 

              //equal_range方法

              pair<map<int,string>::iterator, map<int,string>::iterator > pr =mapA.equal_range(5);

 

              map<int,string>::iterator it4 = pr.first;               //it4指向{5,"小王"}元素

              map<int,string>::iterator it5 = pr.second;           //it5指向{7,"小赵"}元素

 

 

 

 

struct userdevice{

string m_devicename;

long m_deviceid;

int     m_devicePopedom;

};

 

typedef multimap<string,userdevice> USERTABLE;

typedef USERTABLE::const_iterator CIT;

typedef pair<CIT, CIT> Range;

 

 

 

CIT it;

     userdeviced1,d2,d3,d4;

     d1.m_deviceid= 12341234;

     d1.m_devicename= "d1";

     d1.m_devicePopedom= 123;

 

     d2.m_deviceid= 23622344;

     d2.m_devicename= "d2";

     d2.m_devicePopedom= 234;

 

 

     d3.m_deviceid= 3451234;

     d3.m_devicename= "d3";

     d3.m_devicePopedom= 345;

 

     d4.m_deviceid= 43622344;

     d4.m_devicename= "d4";

     d4.m_devicePopedom= 456;

 

     USERTABLEm_user;

     m_user.insert(make_pair("zhangsanfeng",d1));

     m_user.insert(make_pair("zhangsanfeng",d2));

 

     m_user.insert(make_pair("zhangsanfeng2",d3));

     m_user.insert(make_pair("zhangsanfeng2",d4));

     //查找方法一

     Rangerange=m_user.equal_range("zhangsanfeng");

     for(CIT i = range.first;i!=range.second;i++)

     {

         cout<< i->second.m_deviceid<<','

              <<i->second.m_devicename.c_str()<<','

              <<i->second.m_devicePopedom

              <<endl;

     }

     cout<<endl;

     //查找方法二

     CITit2 = m_user.find("zhangsanfeng2");

     while(it2 != m_user.end())

     {

         cout<<it2->second.m_deviceid<<','

              <<it2->second.m_devicename.c_str()<<','

              <<it2->second.m_devicePopedom<<','

              <<endl;

         it2++;

     }

     cout<<endl;

     //遍历

     CITit3 = m_user.begin();

     while(it3 != m_user.end())

     {

         cout<<it3->second.m_deviceid<<','

              <<it3->second.m_devicename.c_str()<<','

              <<it3->second.m_devicePopedom<<','

              <<endl;

         it3++;

     }

 



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值