1-5、数据结构——map

版权声明:本文为博主原创文章,如需转载请联系博主。 https://blog.csdn.net/GregoryHanson/article/details/77837845

本文阅读对象为学过面向对象编程基础的读者。

一、概述

Matlab常用基本数据类型有:整型,浮点型,字符型,函数句柄,元胞数组和结构体数组。除此之外还有一些Matlab封装好的数据结构容器,具体类别可以和c++的stl模板库对比。本文介绍的是其中十分具代表性的一种容器:containers.Map,即map容器,用中文我们可以把它叫做映射表。

map容器与python中的dictionary结构相同,在一些其他语言里也很常用。但本校c语言、c++课程里大多没有介绍此数据结构。在数学建模中,这是一个纯编程的技巧。在一些复杂的、需要多个映射关系的、不易于用矩阵直接映射的编程中,使用map容器将能大大简化代码,有时甚至能帮助将一些以队伍里程序员现有水平难以编程实现的算法实现。

map容器和函数映射有些类似。函数映射的定义是:F(x)=y 针对每一个X,都有一个唯一的Y与之对应,反之不一定。而映射表用来形容键(Key)和键值(Key Value)之间的一一对应关系。每个Key都是独一无二的,且只能对一个Key Value。键相当于函数里的x,键值相当于函数里的y。
如图所示:

           

containers.Map是一个MATLAB的内置类(类是面向对象编程中的一个基本概念,在这里可以把一种类暂时理解成一种数据类型)。所谓内置,就是MATLAB内部实现的,通常这种类的性能更加的优秀。containers.Map其中containers是Package的名称,Map是该Package中的一个类,Map是它的类名。用UML(Unified Modeling Language)的语法把该类表示出来如下:

这里写图片描述

它的属性包括Count, KeyType,ValueType。它的常用方法(函数)包括keys,values,isKey,remove。

二、使用讲解

1、构造一个map:

>> weekmap=containers.Map({'Monday','Tuesday'},{1,2})

weekmap = 

  Map (带属性):

        Count: 2
      KeyType: char
    ValueType: double

或者:

>> weekmap=containers.Map;
>> weekmap('Monday')='1';weekmap('Tuesday')='2';
>> weekmap

weekmap = 

  Map (带属性):

        Count: 2
      KeyType: char
    ValueType: any

其中Count 表示Map对象中映射对的数目。按照规定,键的类型一定要是字符类型,不能是其它数据类型,而键值的类型可以是MATLAB中的任意类型:数组,元胞,结构体,MATLAB对象,甚至JAVA对象等等。因为键值的类型可以是任何MATLAB类型,所以 containers.Map 是MATLAB中极其灵活的数据类型。

2、查找使用:

>> weekmap('Monday')

ans =

1

3、添加新的元素:

>> weekmap('Friday')=5

weekmap = 

  Map (带属性):

        Count: 3
      KeyType: char
    ValueType: any

4、查看:

>> keys(weekmap)

ans = 

    'Friday'    'Monday'    'Tuesday'

>> values(weekmap)

ans = 

    [5]    '1'    '2'

>> values(weekmap,{'Monday','Friday'})

ans = 

    '1'    [5]

解释:上文建立键值对时,Monday和Tuesday建立时等号右边为‘1’,‘2’,表示字符串。而Friday对应的则是5,没有单引号,此时默认将5作为cell类型而不是数字或字符。由此可见,同一个map对象的不通值可以是不同的数据类型,可以灵活地运用在不同场合。

5、 连接两个map:

>> weekmap1=containers.Map('Thursday',4);
>> weekmap2=[weekmap;weekmap1]

weekmap2 = 

  Map (带属性):

        Count: 4
      KeyType: char
    ValueType: any

注:使用列形式连接,而不是行连接[map1, map2];连接时,若两个map中有相同的key值,结果以后一个map的为准。

6、删除map里面的内容:

>> remove(weekmap,'Monday')

ans = 

  Map (带属性):

        Count: 2
      KeyType: char
    ValueType: any 

7、修改键值,跟添加一样,直接对要修改的键赋修改的键值即可:


>> weekmap('Monday')='8';
>> weekmap('Monday')

ans =

8

8、修改键,要先删除键,然后加入新的:

>> remove(weekmap,'Monday');
>> weekmap('Sunday')=8

weekmap = 

  Map (带属性):

        Count: 3
      KeyType: char
    ValueType: any 

9、判断一个map对象中是否已经含有一个键值:

>> isKey(weekmap,'Tuesday')

ans =

     1

>> isKey(weekmap,'tuesday')    %键对大小写敏感

ans =

     0

10、 map类型实际上是一个对象或类,同时也是一个句柄对象,具有句柄对象的特征,跟引用差不多。比如说你将已有的map复制一份,matlab不会创建一个新的map,而是相当于给原来的对象取别名,指向的是同一个内存块。如果修改了其内容,原来的也修改,若删除别名,不影响内存变化,原map依然存在。

11、使用数组和元胞数组作为数据容器,通常要预先分配容器的大小。否则每次扩充容器,MATLAB都会重新分配内存,并且拷贝原来数组中的数据到新分配的内存中去。映射表是一个可以灵活扩充的容器,并且不需要预分配,每次往里面添加内容不会引起MATLAB重新分配内存。

12、 map对象可以传给任何MATLAB的函数,并且在函数内部直接修改对象内部的数据,并且不用把它当做返回值输出。

13、映射表采取的底层实现是哈希表(Hash Map),搜索时间是常数C(而传统的数组和元胞数组查找的复杂度是线性O(N)的),理论上来说搜索速度和集合中元素的个数没有关系。所以当容器中元素数量众多的时候,要想查找得快,可以使用containers.Map结构。

三、其他推荐参考网站

关于C++ hash_map 与 map 区别可参考:
http://blog.csdn.net/EckelWei/article/details/8571191

关于哈希表的内容可参考:
http://www.cnblogs.com/dolphin0520/archive/2012/09/28/2700000.html

关于将数组,元胞数组,结构体和containers.map进行对比,体现出containers.map的优越性可参考:http://www.ilovematlab.cn/article-56-1.html (本文引用了其部分内容)

猜你喜欢

转载自blog.csdn.net/GregoryHanson/article/details/77837845
今日推荐