STL之map、multimap

map是标准的关联式容器,一个map是一个键值对序列,即(key,value)对。它提供基于key的快速检索能力。

map中key值是唯一的。集合中的元素按一定的顺序排列。元素的插入过程是按照排序规则插入,所以不能指定插入位置。

map的具体实现采用红黑树的变体平衡二叉树的数据结构。在插入删除操作上快于vector。

map可以直接存取key对应的value,支持[]操作符,如map[key] = value;

multimap与map的区别:map支持唯一键值,每个键值只能出现一次,而multimap中相同键可以出现多次multimap不支持[]操作符.

 map中插入元素有三种方式:

1 map<int,string> mapA;
2 mapA.insert(pair<int,string>(3,"小王"));
3 mapA.insert(map<int,string>::value_type(1,"小李"));
4 mapA[2] = "小刘";

 .insert()方法返回值是pair<iterator,bool>

pair<map<int,string>::iterator,bool> pairResult = mapA.insert(pair<int,string>(4,"小猪"));

 map<int,string,less<int>> mapA;//这样就是关键字升序

 1 map<int,string,greater<int>> mapA;
 2 mapA.insert(pair<int,string>(3,"小王"));
 3 mapA.insert(map<int,string,greater<int>>::value_type(1,"小李"));
 4 mapA[2] = "小刘";mapA.insert(make_pair(6,"小彭"));
 5 pair<map<int,string,greater<int>>::iterator,bool> pairResult = 
 6 mapA.insert(pair<int,string>(4,"小猪"));
 7 for (map<int,string,greater<int>>::iterator it = mapA.begin();it != mapA.end();it++)
 8 {
 9     cout<<it->second<<" ";
10 }
11 cout<<endl;

以上是升序

 虽然说查找似乎有两种方法但是我只是成功了一种另一种总是有bug所以我还是只贴出来一个算了:

 1 //声明和定义
 2 struct userdevice
 3 {
 4     string m_devicename;
 5     long m_deviceid;
 6     int m_devicePopedom;
 7 };
 8 
 9 typedef multimap<string,userdevice> USERTABLE;
10 typedef USERTABLE::const_iterator CIT;
11 typedef pair<CIT,CIT> Rang;
12 
13 //主函数
14 CIT itmset;
15 
16     userdevice d1,d2,d3,d4;
17     d1.m_deviceid = 12341234;
18     d1.m_devicename = "d1";
19     d1.m_devicePopedom = 123;
20 
21     d2.m_deviceid = 23622344;
22     d2.m_devicename = "d2";
23     d2.m_devicePopedom = 234;
24 
25     d3.m_deviceid = 34513234;
26     d3.m_devicename = "d3";
27     d3.m_devicePopedom = 345;
28 
29     d4.m_deviceid = 43622344;
30     d4.m_devicename = "d4";
31     d4.m_devicePopedom = 456;
32 
33     USERTABLE m_user;
34     m_user.insert(make_pair("liuzhimin",d1));
35     m_user.insert(multimap<string,userdevice>::value_type("peng",d2));
36     m_user.insert(make_pair("liuzhimin2",d3));
37     m_user.insert(make_pair("liuzhimin2",d4));
38 
39 
40     Rang range = m_user.equal_range("peng");
41     for (CIT i = range.first;i != range.second;i++)
42     {
43         cout<<i->second.m_deviceid<<','
44             <<i->second.m_devicename.c_str()<<','
45             <<i->second.m_devicePopedom<<endl;
46     }
原文地址:https://www.cnblogs.com/XCoderLiu/p/3521787.html