C114门户论坛百科APPEN| 举报 切换到宽版

亚星游戏官网

 找回密码
 注册

只需一步,快速开始

短信验证,便捷登录

搜索

军衔等级:

亚星游戏官网-yaxin222  中士

注册:2009-4-23
发表于 2010-2-5 13:22:24 |显示全部楼层
给出了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就好了

举报本楼

您需要登录后才可以回帖 登录 | 注册 |

手机版|C114 ( 沪ICP备12002291号-1 )|联系大家 |网站地图  

GMT+8, 2024-11-28 12:38 , Processed in 0.152391 second(s), 15 queries , Gzip On.

Copyright © 1999-2023 C114 All Rights Reserved

Discuz Licensed

回顶部
XML 地图 | Sitemap 地图