loops - 最长连续数列长度 - 给出一个list找到top k最大的数




ipairs在未排序的数组上是可靠的吗? (2)

我想知道是否有人可以确认你是否可以信任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()迭代所有的值,但是这总是保证吗?


一个Lua表没有顺序。

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

实现优化存储“数字”键的正整数值从1开始,并在他们选择的一个点结束,增长和缩小内部结构与时间内存权衡的各种表操作。

pairs在表中的所有键值pairs操作。

ipairs运行一个连续正整数值键的概念序列,并且在第一个nil值之前结束。 其他键值对将被忽略。 所以,只要你的“索引完整”的想法相匹配,你的答案是“是的,通过设计”。

table.sort也是这样。 其他键值对将被忽略。

默认的表长度运算符( # )是更具限制性的。 它在具有“序列”的表上操作,这些表是没有带有正整数值(空序列)的“数字”型键或具有正整数值的所有“数字”型键是连续序列的表,从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停止。





lua-table