c++ STL 容器之 map

这篇文章主要对比map, multimap, unordered map和unordered multimap.

当我们发现某两个数据之间成对存在,并彼此关联,就可以用map这种容器来存放这对数据,根据是否需要元素有序,和key值是否可以重复来选择不同的容器。

如果需要储存的元素是有序的,就要选择map,如果不需要元素有序,就可以选择onordered_map。 使用map的时候,通过key值访问元素会比使用unordered_map要慢。

Map:

1. Map中的元素通过键值对组织在一起,也就是说可以通过key来找到与其对应的元素。

2. Map中的元素要按照一定的顺序排列起来,即便是新插入的元素,也要根据这个顺序给它合适的位置。

3. Map中任意两个元素不能享有同一个key值。

4. Map是用二叉搜索数实现的。

Unordered_map:

1. Unordered_map中的元素通过键值对组织在一起,也就是说可以通过key来找到与其对应的元素。

2. Unordered_map中的元素不需要按照一定的顺序排列,插入的顺序就是元素在unordered_map里的顺序。

3. Unordered_map中任意两个元素不能享有同一个key值。

4. Unordered_map是用hash table组织元素结构的。

总结:通过讨论元素是否有序(通过key值排序)选择map或者unoredered_map.

以上是当key值不能重复的时候的情况,如果可以允许两个或者两个以上的元素使用同一个key值,map和unordered_map就不好使了。这种情况下可以使用multimap,multimap允许两个或者两个以上元素享用同一个key值,然后在根据元素是否需要被排序来选择multimap或者unordered_multimap;

需要注意的是,multimap和map享用同一个头文件,unordered_map和unordered_multimap享用同一个头文件。

#include
   
   
    
    
using namespace std;
#include
    
    
#include
     
     
      
      
int main() {
	map
      
      
       
        hash;
	multimap
       
       
         hash1; unordered_map 
        
          hash_unordered; unordered_multimap 
         
           hash_unordered1; hash.insert(pair 
          
            (4, 2)); hash.insert(pair 
           
             (3, 2)); hash.insert(pair 
            
              (3, 3)); hash.insert(pair 
             
               (2, 3)); hash1.insert(pair 
              
                (4, 2)); hash1.insert(pair 
               
                 (3, 2)); hash1.insert(pair 
                
                  (3, 3)); hash1.insert(pair 
                 
                   (2, 3)); hash_unordered.insert(pair 
                  
                    (4, 2)); hash_unordered.insert(pair 
                   
                     (3, 2)); hash_unordered.insert(pair 
                    
                      (3, 3)); hash_unordered.insert(pair 
                     
                       (2, 3)); hash_unordered1.insert(pair 
                      
                        (4, 2)); hash_unordered1.insert(pair 
                       
                         (3, 2)); hash_unordered1.insert(pair 
                        
                          (3, 3)); hash_unordered1.insert(pair 
                         
                           (2, 3)); cout << "map:" << endl; map 
                          
                            ::iterator it; for (it = hash.begin(); it != hash.end(); it++) { cout << it->first<<":" < 
                           
                             second<< endl; } cout << "multi map:" << endl; multimap 
                            
                              ::iterator it1; for (it = hash1.begin(); it != hash1.end(); it++) { cout << it->first << ":" << it->second << endl; } cout << "unordered_map:" << endl; unordered_map 
                             
                               ::iterator it2; for (it2 = hash_unordered.begin(); it2 != hash_unordered.end(); it2++) { cout << it2->first << ":" << it2->second << endl; } cout << "unordered_multi map:" << endl; unordered_multimap 
                              
                                ::iterator it3; for (it3 = hash_unordered1.begin(); it3 != hash_unordered1.end(); it3++) { cout << it3->first << ":" << it3->second << endl; } system("pause"); } 
                               
                              
                             
                            
                           
                          
                         
                        
                       
                      
                     
                    
                   
                  
                 
                
               
              
             
            
           
          
         
       
      
      
     
     
   
   


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值