给出了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如下:

 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 || (key1 > rhs.key1 && key2 < rhs.key2 ) ) && ( key2 < rhs.key2 ) );
10   }
11 };

(六) 如果被存储的T允许重复,可用multimap
(七) 如果Key本身就是需要被存储的T, 只要将map换成set就好了

posted on 2009-01-04 16:40  Evilbaniry  阅读(25821)  评论(1编辑  收藏  举报