zoukankan      html  css  js  c++  java
  • Lua中 pairs和ipairs的区别

    Lua系列–pairs和ipairs
    Lua中Table的存储方式
    在看二者的区别之前,我们首先来看一下Lua中的table是如何在内存中进行分配的。
    Table的组成:
    1.哈希表 用来存储Key-Value 键值对,当哈希表上有冲突的时候,会通过链表的方式组织冲突元素
    2.数组 用来存储 数据(包括数字,表等)
    我们来看一个简单的例子。

    print('test pairs and ipairs')
    local t =
    {
    [1] = 1,
    2,
    [3] = 3,
    4,
    [5] = 5,
    [6] = 6
    }

    print('ipairs ')
    for i, v in ipairs(t) do
    print(v)
    end


    print('pairs ')
    for i, v in pairs(t) do
    print(v)
    end

    输出结果

    test pairs and ipairs
    ipairs
    2
    4
    3
    pairs
    2
    4
    3
    6
    5

    看到输出结果是不是感觉有点莫名其妙,和平时接触的遍历感觉不太一样。
    我们来看一下这中间Table发生了怎样的存储变化

    数据在表 t 中的存储方式:
    1)根据元素类别分别存进哈希表与数组:
    哈希表:{ [1]=1,[3]=3,[5]=5,[6]=6 };
    数组:{ 2,4 }
    2)将数组中的元素放入哈希表:
    当数组中的元素转移到哈希表时,数组中的元素变为[1]=2与[2]=4;而此时哈希表中已有键值对 [1]=1,发生冲突,会将新值2重新与键1匹配,即得到新的键值对[1]=2,此时的哈希表元素为:
    { [1]=2,[2]=4,[3]=3,[5]=5,[6]=6 }

    断点调试验证,


    以上是纯数字的内容,我们来尝试看一下数字和表混合的内容

    local testTab ={1,2,3,4,5};
    -- '纯表'
    local testTab1 = {a = 1, b = 2, c =3};
    -- '杂表1'
    local testTab2 = {"zi",a = 5,b = 10, c = 15,"miao","chumo"};
    -- '杂表2'
    local testTab3 = {"zi",a = 5,b = 10, c = 15,"miao",nil,"chumo"};

    输出结果

    ipairs testTab
    1
    2
    3
    4
    5
    pairs testTab
    1
    2
    3
    4
    5
    --------------------------
    ipairs testTab1
    pairs testTab1
    1
    3
    2
    --------------------------
    ipairs testTab2
    zi
    miao
    chumo
    pairs testTab2
    zi
    miao
    chumo
    5
    15
    10
    --------------------------
    ipairs testTab3
    zi
    miao
    pairs testTab3
    zi
    miao
    chumo
    5
    15
    10
    --------------------------

    Lua中的table最终在内存中分配都是键值对的形式


    还是按照先哈希(键值对),后数组(值)的方式进行分配,
    table在存储值的时候是按照顺序的,但是在存储键值对的时候是按照键的哈希值存储的,
    并不会按照键的字母顺序或是数字顺序存储。
    请注意最后一个table,即使元素为空nil的时候,也会分配一个key给它
    想测试的可以自己进行一下测试。

    pairs和ipairs
    二者遍历的区别,

    ipairs( i开头的巧记 int类型的数值开头只是为了助记 不是实际含义)
    遍历的索引的特点
    1.必须是从1开头的 int类型的连续整数 1 2 3 4 5 6 7 8 9 …………………..
    2.索引不能断开,断开则终止遍历(当存在nil 类型的数据)
    终止时机
    1.索引断开
    2.下一个索引不存在

    pairs
    遍历的索引的特点
    1.遍历的顺序是随机的,但是一定会遍历整个表
    2.pairs是先按照索引值打印(数字型key,可以用[ ]访问),然后打印哈希(键值对)
    终止时机
    1.所有元素遍历完毕
    ————————————————
    版权声明:本文为CSDN博主「那远远的云端」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/wwlcsdn000/article/details/81291756

  • 相关阅读:
    HDU 1556 Color the ball
    ECJTUACM16 Winter vacation training #4 题解&源码
    深入理解树状数组
    Codeforces 712C Memory and De-Evolution
    Codeforces 712B Memory and Trident
    Codeforces 708A Letters Cyclic Shift
    也谈matlab中读取视频的一个重要函数mmreader
    What are the advantages of different classification algorithms?
    机器学习算法中如何选取超参数:学习速率、正则项系数、minibatch size
    若心觉醒 自然平静--记我的大三
  • 原文地址:https://www.cnblogs.com/lgj8/p/12357566.html
Copyright © 2011-2022 走看看