Loops IPAIR在未排序的阵列上可靠吗?
我想知道是否有人可以确认您是否可以信任Loops IPAIR在未排序的阵列上可靠吗?,loops,lua,iteration,lua-table,Loops,Lua,Iteration,Lua Table,我想知道是否有人可以确认您是否可以信任ipairs()to;对于索引已完成但未排序的表,按顺序返回所有索引 我们的项目中到处都有使用pairs()克隆表的代码,但是克隆的任何数组都是无序的。但我不确定这是否是个问题 比较: A = {10, 20, 30, 40, 50, 60} 致: 如果您使用对()循环这些,则第一个已订购,而另一个未订购。(在旁注中,B如果你做了几次后插,就会突然被排序) 回到原来的问题。上面的B似乎使用ipairs()按顺序迭代所有值,但这总是有保证的吗?是的,保证ip
ipairs()
to;对于索引已完成但未排序的表,按顺序返回所有索引
我们的项目中到处都有使用pairs()
克隆表的代码,但是克隆的任何数组都是无序的。但我不确定这是否是个问题
比较:
A = {10, 20, 30, 40, 50, 60}
致:
如果您使用对()循环这些,则第一个已订购,而另一个未订购。(在旁注中,B
如果你做了几次后插,就会突然被排序)
回到原来的问题。上面的B
似乎使用ipairs()
按顺序迭代所有值,但这总是有保证的吗?是的,保证ipairs
按顺序迭代带有1
中整数键的表。表是否排序并不重要
发件人:
将迭代对(1
,t[1]
),(2
,t[2]
),…,直到表中缺少的第一个整数键
是的,会的
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
但是,
因为1,2,3
是连续的,但在4
中中断,所以ipairs
停止。Lua表没有顺序。
它只是一组非nil
键,每个键都与一个非nil
值关联
实现确实优化了“数字”类型的键的存储,这些键的正整数值从1开始,在其选择的某个点结束,通过各种表操作的时间-内存权衡来增长和收缩内部结构
对
对表中的所有键值对进行操作
ipairs
对具有1且在第一个nil
值之前结束的连续正整数值键的概念序列进行操作。忽略其他键值对。所以,你的答案是“是的,是设计的”,只要你的“索引完成”的想法匹配
table.sort
执行相同的操作。忽略其他键值对
默认的表长度运算符(#
)限制性更强。它对具有“序列”的表进行操作,这些表没有带正整数值的“数字”类型键(空序列),或者所有带正整数值的“数字”类型键都是从1开始的连续序列。如果对非序列使用默认的表长度运算符,则会得到未定义的行为。很好的解释。如果我理解正确;这是因为我使用的Lua实现,A={10,20,30,40,50,60}
在使用pairs()循环时会按顺序结束。但是不是标准的一部分。@CalvinE,如果您运行的是Lua 5.2,当您再次运行程序时,遍历顺序可能会改变。谢谢您的参考,这正是我想要的。虽然Tom对实现的详细阐述让我有了更深的理解,并赢得了这次的“解决方案”。
for i,v in ipairs(t) do body end
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