(转)std::map的用法总结

来源:互联网 发布:淘宝网我是卖家在哪里 编辑:程序博客网 时间:2024/06/07 05:09

给出了map的基本用法如插入、查找、删除、遍历等等,同时告诉你如何实现双键map,包括 
(1) 只有两个键都匹配才命中目标
(2) 两个键中任意一个匹配就命中目标

可以扩展到多键

(一) 介绍
特点:
1.map将Key的object和T的Object绑定到一起,因此是一种Pair Associative Container, 表示其value type为 pair。
2.它同时也是Unique Associative Container,表示没有两个元素具有相同的Key。
3.它还是一种Sorted Associative Container,因此第三个参数只能是less,greater之类的functor, 相比较而言,
  hash table是 equal_to, not_equal_to之类的functor。
(二) 基本用法
通过以下范例,可以看出map的一些基本用法: 插入、查找、删除、遍历等等。

复制代码
 1 #if defined (_MSC_VER)
 2 #pragma warning(disable: 4786)
 3 #endif
 4 #include <iostream>
 5 #include <map>
 6 #include <algorithm>
 7 int main(int argc, char *argv[])
 8 {
 9   /* define a map */
10   std::map _map;
11    
12   /* insert */
13   _map.insert( std::map::value_type(032.8) );
14   _map.insert( std::map::value_type(133.2) );
15   _map.insert( std::map::value_type(235.8) );
16   _map.insert( std::map::value_type(336.4) );
17   _map.insert( std::map::value_type(437.8) );
18   _map.insert( std::map::value_type(535.8) );
19    
20   /* 这个是常用的一种map赋值方法 */
21   _map[7= 245.3;
22    
23   /* find by key */
24   std::map::iterator itr;
25   itr = _map.find(4);
26    
27   if( itr != _map.end() )
28   {
29   std::cout << "Item:" << itr->first << " found, content: " << itr->second << std::endl;
30   }
31    
32   std::cout << std::endl;
33    
34   /* delete item from map */
35   if( itr != _map.end() )
36   {
37   _map.erase(itr);
38   }
39    
40   /* travel through a map */
41   std::map::iterator itr1 = _map.begin();
42   for( ; itr1 != _map.end(); ++itr1 )
43   {
44   std::cout << "Item:" << itr1->first << ", content: " << itr1->second << std::endl;
45   }
46    
47   std::cout << std::endl;
48    
49   /* empty a map */
50   _map.clear();
51    
52   return 0;
53 }
复制代码


(三) 当Key是结构时该如何定义结构
比如 Key是结构MyStruct类型, 此时map可以定义如下:
std::map > _map;
其中Compare 缺省是std::less,这里可以不写,自定义的结构必须实现Compare指定的比较操作,因此自定义结构
MyStruct必须按照如下写法:

复制代码
1 struct MyStruct
2 {
3   int key;
4    
5   bool operator < ( const MyStruct rhs) const
6   {
7   return key < rhs.key;
8   }
9 };
复制代码

当然也可以实现全局operator <

1 bool operator < ( const MyStruct lhs, const MyStruct rhs) 
2 {
3   return lhs.key < rhs.key;
4 }

另外,当Compare 是std::greater时,需要实现 operator >
(四) 如何实现两个Key的map, 只有两个Key都匹配才命中目标
可以定义结构MyStruct如下:
复制代码
 1 struct MyStruct
 2 {
 3   int key1;
 4   double key2
 5    
 6   bool operator < ( const MyStruct rhs) const
 7   {
 8   /* 两个key必须都匹配才命中 */
 9   return ( key1 < rhs.key1 || key2 < rhs.key2 );
10   }
11 };
复制代码

(五) 如何实现两个Key的map, 两个Key中任意一个匹配就命中目标
可以定义结构MyStruct如下:

复制代码
0 0