【问题标题】:Is ipairs reliable on unsorted arrays?ipairs 在未排序的数组上可靠吗?
【发布时间】:2015-02-17 09:44:06
【问题描述】:

我想知道是否有人可以确认您是否可以信任ipairs();对于索引完整但未排序的表,按顺序返回所有索引。

我们的项目中到处都有使用pairs() 克隆表的代码,但是克隆出来的任何数组都是无序的。不过我不确定这是否是个问题。

比较:

A = {10, 20, 30, 40, 50, 60}

到:

B = {[1] = 10, [2] = 20, [3] = 30, [4] = 40, [5] = 50, [6] = 60}

如果你用pairs() 循环这些,第一个是有序的,而另一个不是。 (附带说明,如果您执行几次反向插入,B 会突然排序)

回到原来的问题。上面的B 似乎使用ipairs() 按顺序迭代所有值,但这总是保证吗?

【问题讨论】:

    标签: loops lua iteration lua-table


    【解决方案1】:

    是的,会的。

    ipairs() 将从索引1 连续迭代到n,并在第一个不连续的索引中中断。

    例如:

    B = {[1] = 10, [2] = 20, [3] = 30, [4] = 40, [5] = 50, [6] = 60}    
    
    for i,v in ipairs(B) do
        print(i,v)
    end
    
    will print:
    1   10
    2   20
    3   30
    4   40
    5   50
    6   60
    

    但是,

    B = {[1] = 10, [2] = 20, [3] = 30, [5] = 40, [6] = 50, [7] = 60}    
    
    for i,v in ipairs(B) do
        print(i,v)
    end
    
    will print
    1   10
    2   20
    3   30
    

    因为1,2,3是连续的,但是在4中断,所以ipairs停止。

    【讨论】:

      【解决方案2】:

      Lua 表没有顺序。

      它只是一组非nil 键,每个键与一个非nil 值相关联。


      实现确实优化了具有正整数值的“数字”类型键的存储,这些键从 1 开始并在它们选择的某个点结束,并在时间内存权衡的情况下为各种表操作选择增长和收缩内部结构。

      pairs 对表中的所有键值对进行操作。

      ipairs 对连续的正整数值键的概念序列进行操作,键为 1,并在第一个 nil 值之前结束。其他键值对被忽略。 所以,只要你的“索引完整”的想法匹配,你的答案就是“是的,按设计”。

      table.sort 也是如此。其他键值对被忽略。

      默认的表长度运算符 (#) 限制性更强。它对具有“序列”的表进行操作,这些表是没有具有正整数值(空序列)的“数字”类型键的表,或者所有具有正整数值的“数字”类型键都是连续序列的表,从 1 开始。如果对非序列使用默认的表长度运算符,则会得到未定义的行为。

      【讨论】:

      • 很好的解释。如果我理解正确;这是因为我使用的 Lua 实现,A = {10, 20, 30, 40, 50, 60} 最终在与pairs() 循环时排序。但不是标准的一部分。
      • @CalvinE,如果你运行的是 Lua 5.2,那么当你再次运行程序时,遍历顺序可能会改变。
      【解决方案3】:

      是的,保证ipairs 按顺序使用来自1 的整数键迭代一个表。表格是否排序无关紧要。

      来自Reference Manual: ipairs

      for i,v in ipairs(t) do body end
      

      将遍历对 (1,t[1]), (2,t[2]), ...,直到表中缺少的第一个整数键。

      【讨论】:

      • 感谢您的参考,正是我想要的。虽然汤姆对实现的阐述让我有了更深的理解,并赢得了这次的“解决方案”。
      猜你喜欢
      • 1970-01-01
      • 2015-11-10
      • 1970-01-01
      • 1970-01-01
      • 2017-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-14
      相关资源
      最近更新 更多