如何删除 Lua 表中的所有元素?我不想这样做:
t = {}
table.insert(t, 1)
t = {} -- this assigns a new pointer to t
我想保留指向 t 的相同指针,但删除t
.
我试过了:
t = {}
table.insert(t, 1)
for i,v in ipairs(t) do table.remove(t, i) end
以上有效吗?还是需要其他东西?
for k in pairs (t) do
t [k] = nil
end
也可以工作 - 如果表格始终不用作数组,您可能会遇到 ipairs 困难。
表格元素插入和删除性能比较
表大小计数 10000000
[1] while 和 rawset
while #t ~= 0 do rawset(t, #t, nil) end
花费时间 = 0.677220
[2] 下一个和原始集
for k in next, t do rawset(t, k, nil) end
花费时间 = 0.344533
[3] ipairs 和 rawset
for i, v in ipairs(t) do t[i] = nil end
花费时间 = 0.012450
[4] 为,原始集
count = #t
for i=0, count do t[i]=nil end
花费时间 = 0.009308
表元素插入
[1] 表格插入功能
for i=0, 10000000 do table.insert(t, i, i) end
花费时间 = 1.0590489
[2] 使用#t
for i=0, 10000000 do t[#t+1] = i end
花费时间 = 0.703731
[3] 为,原始集
for i=0, 10000000 do rawset(t, i, i) end
花费时间 = 0.100010
结果。
最快移除:4
最快插入:3
最简单和最高效的:
for k,v in pairs(tab) do tab[k]=nil end
你的建议是不可用的:table.remove
移动剩余的元素来关闭这个洞,从而弄乱了表格的遍历。有关详细信息,请参阅下一个功能的说明
对于忽略元方法的更快版本__pairs
:
local next = next
local k = next(tab)
while k ~= nil do
tab[k] = nil
k = next(tab, k)
end
编辑:正如@siffiejoe 在评论中提到的那样,这可以通过将pairs
调用替换为表的默认返回值来简化为 for 循环:next
方法和表本身。此外,为避免所有元rawset
方法,请使用表索引分配方法:
for k in next, tab do rawset(tab, k, nil) end
#table
是桌子的大小,所以如果t = {1,2,3}
那时#t = 3
因此,您可以使用此代码删除元素
while #t ~= 0 do rawset(t, #t, nil) end
您将浏览表格并删除每个元素,最后您会得到一个空表格。