注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

创思通信官网:www.csgsm.com

创思通信-引领物联网新时代 520ic.taobao.com

 
 
 

日志

 
 
 
 

STL map用法总结   

2010-04-20 16:59:14|  分类: c&c++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

给出了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的一些基本用法: 插入、查找、删除、遍历等等。
/* 这个是MS的bug,看着心烦,屏蔽掉警告 */
#if defined (_MSC_VER)
#pragma warning(disable: 4786)
#endif
#include
#include
#include
int main(int argc, char *argv[])
{
    /* define a map */
    std::map _map;
   
    /* insert */
    _map.insert( std::map::value_type(0, 32.8) );
    _map.insert( std::map::value_type(1, 33.2) );
    _map.insert( std::map::value_type(2, 35.8) );
    _map.insert( std::map::value_type(3, 36.4) );
    _map.insert( std::map::value_type(4, 37.8) );
    _map.insert( std::map::value_type(5, 35.8) );
   
    /* 这个是常用的一种map赋值方法 */
    _map[7] = 245.3;
   
    /* find by key */
    std::map::iterator itr;
    itr = _map.find(4);
   
    if( itr != _map.end() )
    {
        std::cout << "Item:" << itr->first << " found, content: " << itr->second << std::endl;
    }
   
    std::cout << std::endl;
   
    /* delete item from map */
    if( itr != _map.end() )
    {
        _map.erase(itr);
    }
   
    /* travel through a map */
    std::map::iterator itr1 = _map.begin();
    for( ; itr1 != _map.end(); ++itr1 )
    {
        std::cout << "Item:" << itr1->first << ", content: " << itr1->second << std::endl;
    }
   
    std::cout << std::endl;
   
    /* empty a map */
    _map.clear();
   
    return 0;
}

(三) 当Key是结构时该如何定义结构
比如 Key是结构MyStruct类型, 此时map可以定义如下:
std::map > _map;
其中Compare 缺省是std::less,这里可以不写,自定义的结构必须实现Compare指定的比较操作,因此自定义结构
MyStruct必须按照如下写法:
struct MyStruct
{
    int key;
   
    bool operator < ( const MyStruct rhs) const
   {
        return key < rhs.key;
   }
};
当然也可以实现全局operator <
bool operator < ( const MyStruct lhs, const MyStruct rhs)
{
    return lhs.key < rhs.key;
}
另外,当Compare 是std::greater时,需要实现 operator >
(四) 如何实现两个Key的map, 只有两个Key都匹配才命中目标
可以定义结构MyStruct如下:
struct MyStruct
{
    int key1;
    double key2
   
    bool operator < ( const MyStruct rhs) const
   {
        /* 两个key必须都匹配才命中 */
        return ( key1 < rhs.key1 || key2 < rhs.key2 );
   }
};
(五) 如何实现两个Key的map, 两个Key中任意一个匹配就命中目标
可以定义结构MyStruct如下:
struct MyStruct
{
    int key1;
    double key2
   
    bool operator < ( const MyStruct rhs) const
   {
        /* 两个key任意一个匹配就命中 */
        return ( ( key1 < rhs.key1 || (key1 > rhs.key1 && key2 < rhs.key2 ) ) && ( key2 < rhs.key2 ) );
   }
};
(六) 如果被存储的T允许重复,可用multimap
(七) 如果Key本身就是需要被存储的T, 只要将map换成set就好了
  评论这张
 
阅读(1962)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018